Свободно переопределяет базовый класс NHibernate automap

#c# #.net #nhibernate #fluent-nhibernate #automapping

#c# #.net #nhibernate #свободно-nhibernate #автоматическое отображение

Вопрос:

У меня есть следующий базовый класс.

 public abstract class BaseEntity
{
    public virtual long Id { get; set; }
    public virtual DateTime CreateDate { get; set; }
    public virtual DateTime? UpdateDate { get; set; }
    public virtual bool IsDeleted { get; set; }
    public virtual string CreatedBy { get; set; }
}
  

И это базовый класс для всех сущностей.

Например,

 public class Task : BaseEntity
{
    public virtual string Name {get;set;}
}
  

У меня есть инициализатор,

 public class Initializer
{
    public static AutoPersistenceModel MapEntities()
    {
        var p = AutoMap
            .AssemblyOf<User>(new MyDefaultAutomappingConfiguration())
             .IgnoreBase<BaseEntity>()
            .UseOverridesFromAssemblyOf<Initializer>()
            .Override<BaseEntity>(map =>
            {
                map.Map(b => b.CreateDate).Not.Nullable().Not.Update();
                map.Map(b => b.CreatedBy).Not.Nullable().Length(100);
                map.Map(b => b.ModifiedBy).Length(100);
                map.Map(b => b.DeletedBy).Length(100);
                map.Map(b => b.IsDeleted).Not.Nullable().Default("0");
            });
        return p;
    }
}
  

И, конечно, в базе данных — CreateDate — это datetime, null, а CreatedBy — это nvarchar(255).

Как я могу настроить этот AutoMapper, чтобы получать эти сопоставления из базового класса во все дочерние классы?

Ответ №1:

Вы не можете переопределить сопоставление для базового класса, поскольку это сопоставление фактически никогда не создается. Если вы хотите продолжать использовать Automapper, вы можете создать соглашение

 public class BaseEntityPropertiesConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        if (instance.EntityType.IsSubclassOf(typeof(BaseEntity)))
        {
            switch instance.Name
            {
                case "CreatedDate":
                    instance.Not.Nullable().Not.Update();
                    break;
                case "CreatedBy":
                    instance.Not.Nullable().Length(100);
                    break;
                //etc...
            }
        }
    }
}