はい、流暢な API を介して作成する方法がありますが、マッピングは、期待する継承のタイプに依存します。現時点では、デフォルトの Table-per-Hierarchy 継承マッピングがあり、すべてのエンティティが同じテーブルにマップされ、デフォルトで 1 つの追加の列が呼び出されDiscriminator
、各レコードに格納されているタイプが異なります。
次のエンティティがあるとします。
public class Animal {
public int Id { get; set; }
public string Name { get; set; }
}
public class Dog : Animal {
public string Breed { get; set; }
}
Table-per-Type 継承マッピングを使用する場合:
public class Context : DbContext {
public DbSet<Animal> Animals { get; set; }
public DbSet<Dog> Dogs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Dog>().ToTable("Dogs");
}
}
Animals
with Id
and Name
columns とDogs
with Id
and columnの 2 つのテーブルが得られBreed
ます。Dog
各エンティティは両方のテーブルにレコードを持っているため、テーブル間にも 1 対 1 の関係があります。
Table-per-Class 継承マッピングを使用する場合:
public class Context : DbContext {
public DbSet<Animal> Animals { get; set; }
public DbSet<Dog> Dogs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Dog>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Dogs");
});
}
}
再び 2 つのテーブルが表示されます。Animals
最初のケースと同じになりDogs
ますが、親クラスと子クラスの両方の列が含まれます: Id
、Name
、Breed
. また、Dog はすべてのデータを独自のクラスに持つため、これらのエンティティ間に関係はありません。
TPC 継承の方が優れているように見えるかもしれませんが、使用するのははるかに困難です。たとえば、EF は ID を使用しません。これはId
、ID が TPC 継承のすべてのテーブル間で一意である必要があるためです。TPC 継承の基本エンティティのナビゲーション プロパティも問題を引き起こします。