3

I have a code first DbContext which uses a base class and sub classes in different DBSets

eg. DbSet Animals; DbSet Dogs; DbSet Cats;

Where Dog and Cat are subclasses of animal. When the database is generated by code first EF 5.0 I only get one table (Animal) - where as I expected (and wanted three) - Animals, Cats & Dogs. Is there a way to make it do this (using the fluent api?)?

4

1 に答える 1

9

はい、流暢な 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");
    }
}

Animalswith Idand Namecolumns とDogswith Idand 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ますが、親クラスと子クラスの両方の列が含まれます: IdNameBreed. また、Dog はすべてのデータを独自のクラスに持つため、これらのエンティティ間に関係はありません。

TPC 継承の方が優れているように見えるかもしれませんが、使用するのははるかに困難です。たとえば、EF は ID を使用しません。これはId、ID が TPC 継承のすべてのテーブル間で一意である必要があるためです。TPC 継承の基本エンティティのナビゲーション プロパティも問題を引き起こします。

于 2012-08-19T19:57:20.930 に答える