EF 5.0 - 在不同的DbSet中使用时,将基类和子类组合到一个数据库表中

Adr*_*oun 3 mapping inheritance entity-framework fluent ef-code-first

我有一个代码,第一个DbContext,它使用不同DBSets中的基类和子类

例如.DbSet动物; DbSet狗; DbSet Cats;

狗和猫是动物的亚类.当数据库由代码首先生成EF 5.0时,我只得到一个表(动物) - 我预期的地方(并且想要三个) - 动物,猫和狗.有没有办法让它这样做(使用流畅的api?)?

Lad*_*nka 9

是的,有一种方法可以通过流畅的API实现它,但映射依赖于您期望的继承类型.目前,您具有默认的每层次表层次继承映射,其中所有实体都映射到同一个表,默认情况下调用一个附加列,Discriminator以便存储在每个记录中的类型之间不同.

假设您有这些实体:

public class Animal {
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Dog : Animal {
    public string Breed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您使用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

您将获得两个表:Animalswith IdNamecolumns以及Dogswith IdBreedcolumn.表之间也存在一对一的关系,因为每个Dog实体都在两个表中都有记录.

如果使用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");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

你将再次获得两张桌子.Animals将同在第一种情况,但Dogs将包含来自父和子类列:Id,Name,Breed.这些实体之间也没有关系,因为Dog将拥有自己类中的所有数据.

TPC继承可能看起来更好,但使用起来要困难得多.例如,EF不使用identity,Id因为Id在TPC继承中的所有表中必须是唯一的.TPC继承的基本实体中的导航属性也会引起问题.