Конфигурации EF Core Fluent API с наследованием
Конфигурация EF CORE Fluent Api в отдельных файлах работает нормально с простыми классами ReF# 1 && ReF# 2. Проблема возникает, когда сущности наследуются от KeyedEntity
или же AuditableEntity
class abstract KeyedEntity<TValue> {
public TValue Id {get; set;}
}
class abstract AuditableEntity<TValue> : KeyedEntityBase<TValue>{
public DateTime DateCreated {get; set;}
public DateTime DateModified {get; set;}
}
Картограф идет как-то так
public class KeyedEntityMap<TEntity, TId>
: IEntityTypeConfiguration<TEntity> where TEntity
: KeyedEntityBase<TId> where TId : struct
{
public void Configure(EntityTypeBuilder<TEntity> builder)
{
// Primary Key
builder.HasKey(t => t.Id);
// Properties
builder.Property(t => t.Id).HasColumnName("id").ValueGeneratedOnAdd();
}
}
public class AuditableEntityMap<TEntity, TId>
: IEntityTypeConfiguration<TEntity> where TEntity
: AuditableEntity<TId> where TId : struct
{
public void Configure(EntityTypeBuilder<TEntity> builder)
{
// Properties
builder.Property(t => t.DateCreated).HasColumnName("DateCreated");
builder.Property(t => t.DateModified).HasColumnName("DateModified");
}
}
Теперь проблема возникает с сущностью, которая наследует от AuditableEntity
, Мне нужно зарегистрировать Map из этого класса, а также AuditableEntityMap
класс и KeyedEntityMap
учебный класс.
Теперь я могу забыть о наследовании карт и объединить все карты сложного наследования в классе сущностей, что я не хочу делать, и соблюдаю DRY. Проблема со сложным наследованием в том, что он не регистрирует мои карты сущностей.
1 ответ
Есть несколько способов добиться СУХОГО для конфигурации базовой сущности.
Самое близкое к вашему текущему проекту - просто следовать иерархии сущностей в классах конфигурации:
public class KeyedEntityMap<TEntity, TId> : IEntityTypeConfiguration<TEntity>
where TEntity : KeyedEntityBase<TId>
where TId : struct
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
// ^^^
{
// Primary Key
builder.HasKey(t => t.Id);
// Properties
builder.Property(t => t.Id).HasColumnName("id").ValueGeneratedOnAdd();
}
}
public class AuditableEntityMap<TEntity, TId> : KeyedEntityMap<TEntity, TId>
// ^^^
where TEntity : AuditableEntity<TId>
where TId : struct
{
public override void Configure(EntityTypeBuilder<TEntity> builder)
// ^^^
{
base.Configure(builder); // <<<
// Properties
builder.Property(t => t.DateCreated).HasColumnName("DateCreated");
builder.Property(t => t.DateModified).HasColumnName("DateModified");
}
}
а затем для конкретного объекта, который нуждается в дополнительной настройке:
public class Person : AuditableEntity<int>
{
public string Name { get; set; }
}
вы бы зарегистрироваться
public class PersonEntityMap : AuditableEntityMap<Person, int>
{
public override void Configure(EntityTypeBuilder<Person> builder)
{
base.Configure(builder);
// Properties
builder.Property(t => t.Name).IsRequired();
// etc...
}
}