当ToTable没有被调用时,EF如何映射非抽象基类型?

时间:2013-08-15 18:25:47

标签: c# entity-framework table-per-subclass

我正在使用EF5 Code-first和实体类,如下所示:

public class Base {
    public int Id { get; set; }
}

public class Derived : Base { // there are other derived types as well
}

然后我按如下方式配置派生实体:

var config = new EntityTypeConfiguration<Base>();
config.Map<Derived>(m =>
{
    m.MapInheritedProperties();
    m.ToTable("derived");
});

DbModelBuilder modelBuilder = ...
modelBuilder.Configurations.Add(config);

在我的申请中,我随后致电:

new MyDbContext().Set<Derived>().First();

此次通话的预期行为是什么?

奇怪的是,对于以完全相同的方式配置的层次结构,我似乎得到了不一致的行为。有时这会失败,因为它尝试查询“dbo.Base”,有时它会正确查询“dbo.Derived”。

1 个答案:

答案 0 :(得分:0)

EF派生类型映射的默认值是Table per Hierarchy。您可以获得blog

上的所有默认值

在你的基础表上有一个名为&#34; Discriminator&#34;的新字段。将添加添加所有字段的derive类型将在数据库中创建一个可空列。

在你的情况下,这应该是TPT,所以表格&#34; base&#34;将包含基类的所有字段和表&#34; derived&#34;将包含派生类的所有字段。两个表都有一个共享主键。

来自博客: 表示继承层次结构有三种不同的方法:

  • 每个层次结构表(TPH):通过非规范化SQL模式启用多态,并使用包含类型信息的类型鉴别器列。
  • 每种类型的表格(TPT):代表&#34;是&#34; (继承)关系为&#34;有一个&#34; (外键)关系。
  • 每个Concrete类的表(TPC):完全从SQL模式中丢弃多态和继承关系。

每个树情景都有优点和缺点,Morteza Manavi's blog

中有很好的描述