Конфигурации EF Core Fluent API с наследованием - PullRequest
0 голосов
/ 25 августа 2018

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;}
}

Mapper Goes Что-то вроде этого

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 из этого класса Specific Enitity вместе с классом AuditableEntityMap и классом KeyedEntityMap.

Теперь я могу забыть о наследовании карты и объединить все карты сложного наследования в классе сущностей, что я не хочу делать и соблюдаю DRY . Проблема со сложным наследованием в том, что он не регистрирует мои карты сущностей

1 Ответ

0 голосов
/ 25 августа 2018

Есть несколько способов добиться СУХОЙ для конфигурации базовой сущности.

Бит ближе всего к вашему текущему дизайну - просто следовать иерархии сущностей в классах конфигурации:

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...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...