未调用 ToTable 时,EF 如何映射非抽象基类型?



我首先使用EF5 Code和实体类,比如:

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"。

EF派生类型映射的默认值为"每个层次的表"。你可以在博客上获得所有默认值

在您的基表上,将添加一个名为"鉴别器"的新字段。添加派生类型中的所有字段将在数据库中创建一个可为Null的列。

在您的情况下,这应该是TPT,因此表"base"将包含基类的所有字段,而表"derived"将包含派生类的所有字段。两个表都将有一个共享主键。

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

  • 每层次表(TPH):通过取消SQL架构的规范化来启用多态性,并使用保存类型信息的类型鉴别器列
  • 按类型表(TPT):将"是a"(继承)关系表示为"有a"(外键)关系
  • 每个具体类的表(TPC):完全放弃SQL模式中的多态性和继承关系

每种树场景都有优缺点,Morteza Manavi的博客

中对此进行了很好的描述

最新更新