首页 > 解决方案 > NHibernate 中是否有 @MappingSupperclass 等价物

问题描述

我最近以 NHibernate 作为 orm 启动了 Asp Net Core 项目。我绝对没有 NHibernate 的经验。我正在寻找 @MappedSuperclass Hibernate 注释的等价物。要么我找不到好的解决方案,要么我无法使用任何找到的解决方案。但从一开始:我的每个实体都继承自基类BaseEntity,包含几个技术领域/列

public class BaseEntity
{
    public virtual long id { get; set; }
    public virtual DateTime inDate { get; set; }
    public virtual DateTime? outDate { get; set; }
    //some other properies
}

public class AnyClass : BaseEntity
{
    //some AnyClass properties
}

public class AnyClassMap : ClassMapping<AnyClass>
{
    public AnyClassMap() 
    {
        Table("any_table");

        //Copy/Paste to each mapping class
        Id(b => b.id, x => { x.Column("id"); x.Generator(Generators.Native); x.Type(NHibernateUtil.Int64); });
        Property(b => b.inDate, x => { x.Column("in_date"); });         
        Version(b => b.outDate, x => { x.Column("out_date"); x.Type(NHibernateUtil.DbTimestamp); });
        //Some other BaseEntity properties

        //some AnyClass properties
    }//ctor
}

在每个映射类中,我都会重复关于基类属性的映射。但是,我想实现类似于:

public class BaseEntityMap : MappedSuperclassEquvalent<BaseEntity>
{
    public BaseEntityMap()
    {
        Id(b => b.id, x => { x.Column("id"); x.Generator(Generators.Native); x.Type(NHibernateUtil.Int64); });
        Property(b => b.inDate, x => { x.Column("in_date"); });         
        Version(b => b.outDate, x => { x.Column("out_date"); x.Type(NHibernateUtil.DbTimestamp); });
        //Some other BaseEntity properties
    }//ctor
}

public class AnyClassMap : ClassMapping<AnyClass>
{
    public AnyClassMap() 
    {
        Table("any_table");

        //example only
        IncludeMapping(BaseEntityMap.Class);

        //some AnyClass properties
    }//ctor
}

我知道我可以将 BaseEntity 用作 ComponentMapping,然后在 AnyClass 类中将其用作属性。但是,ComponentMapping 不允许 id 和版本映射。另一方面,出于许多原因,我关心从基本实体继承。

先感谢您

标签: nhibernatenhibernate-mapping

解决方案


ClassMapping只需根据您需要的所有内容创建基本映射类:

public class BaseEntityClassMapping<TBaseEntity>: ClassMapping<TBaseEntity> where TBaseEntity: BaseEntity
{
    public BaseEntityClassMapping()
    {
            Id(b => b.id, x => { x.Column("id"); x.Generator(Generators.Native); x.Type(NHibernateUtil.Int64); });
            Property(b => b.inDate, x => { x.Column("in_date"); });
            Version(b => b.outDate, x => { x.Column("out_date"); x.Type(NHibernateUtil.DbTimestamp); });
            //Some other BaseEntity properties
    }
}

并根据此类进行映射:

public class AnyClassMap : BaseEntityClassMapping<AnyClass>
{
    public AnyClassMap() 
    {
        Table("any_table");
        //some AnyClass properties
    }
}

推荐阅读