0

我将 EF5 代码优先与实体类一起使用,如下所示:

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

4

1 回答 1

0

EF 派生类型映射的默认值是 Table per Hierarchy。您可以在该博客上获取所有默认值

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

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

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

  • Table per Hierarchy (TPH):通过非规范化 SQL 模式来启用多态性,并利用保存类型信息的类型鉴别器列。
  • Table per Type (TPT):将“is a”(继承)关系表示为“has a”(外键)关系。
  • 每个具体类的表 (TPC):完全从 SQL 模式中丢弃多态性和继承关系。

每个树场景都有优点和缺点,在Morteza Manavi 的博客中都有很好的描述

于 2013-08-15T18:32:01.923 回答