Есть ли эквивалент @MappingSupperclass в NHibernate - PullRequest
0 голосов
/ 15 марта 2020

Я недавно запустил Asp Net Core проект с NHibernate в качестве orm. У меня определенно мало опыта с 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 не разрешает отображение идентификатора и версии. С другой стороны, по многим причинам я забочусь о наследовании от базовой сущности.

Заранее спасибо

1 Ответ

0 голосов
/ 15 марта 2020

Просто создайте базовый класс сопоставления на основе 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
    }
}
...