2016-04-01 8 views
3

抽象基本クラスから派生した2つのエンティティがあり、コンクリート型テーブルを実装したいとします。EFコアで抽象基本クラスの流暢なマッピングを使用するテーブルごとに実装する

public abstract class EntityBase 
{ 
    public int Id { get; set; } 

    public string CreatedBy { get; set; } 

    public DateTime CreatedAt { get; set; } 
} 

public class Person : EntityBase 
{ 
    public string Name { get; set; } 
} 
public class PersonStatus : EntityBase 
{ 
    public string Title { get; set; } 
} 

そして、あなたは抽象基底クラス(EntityBase)で属性を使用する必要はありませんが、あなたは一度だけすべてのエンティティのためにdbcontext でEntityBaseクラスをマッピングしたい:以下のようなエンティティ。あなたはBaseClassのために設定を記述する必要があります。..

public class PeopleDbContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     // Entity base class mapping(only once) 

     modelBuilder.Entity<Person>(e => 
     { 
     e.Property(x => x.Name) 
      .IsRequired() 
      .HasMaxLength(100); 
     }); 
     modelBuilder.Entity<PersonStatus>(e => 
     { 
     e.Property(x => x.Title) 
      .IsRequired() 
      .HasMaxLength(100); 
     }); 
    } 

} 
+0

何か試しましたか?私はこれのような設定を持っており、IDは慣例によって選ばれる。 –

+0

はい、dbcontextで(流暢な)EntityBaseクラスをマップしようとしましたが、EntityBaseクラスの別のテーブルが作成されました。これまでは、流暢なnhibernateを実装していましたが、これはClassMapを使用して正しく動作しました。 また、私はef 6 "builder.Types (..)"を使用しました。それは私が望むように働いた。しかし、コアと私はそれを作ることができませんでした。 –

答えて

0

Hereはあなたの質問への答えである:どのように以下のコードを変更することがその後

public class EntityBaseConfiguration<TBase> : IEntityTypeConfiguration<TBase> 
    where TBase : EntityBase 
{ 
    public virtual void Configure(EntityTypeBuilder<TBase> builder) 
    { 
     builder.HasKey(b => b.Id); 
     builder.Property(b => b.CreatedBy) 
      .HasColumnType("varchar(50)"); 
     builder.Property(b => b.CreatedAt) 
      .HasColumnType("datetime2"); 
    } 
} 

を、次のように書くことができます具体的な設定 - EntityBaseから継承するクラスforeachテーブルso:

public class PersonConfig : BaseConfig<Person> 
{ 
    public override void Configure(EntityTypeBuilder<Person> builder) 
    { 
     base.Configure(builder); 
     builder.Property(e => e.Name) 
      .HasColumnType("varchar(100)") 
      .IsRequired(); 
    } 
} 

dbContextで設定を呼び出すには、ApplyConfigurationを呼び出すことができます。

関連する問題