#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...
}
}
}
}