Entity Framework 中的表继承
本文解释了什么是表每层次结构继承,以及如何在 Entity Framework 中应用它。
引言
在第二个继承映射教程中,我将介绍表每层次结构(TPH)继承映射。如果您想阅读我展示的第一个映射,请转到 这里 的表每类型文章。
表每层次结构定义
在TPH中,继承树仅通过一个表创建。
TPH继承依赖于一个条件映射,该映射由一个条件定义,例如鉴别器数据库字段。该条件用于将记录定义为不同的类型。例如,在以下数据库模式中,Person
表包括一个 TPH 继承
正如您所看到的,该表包含来自两种不同类型的两个不同字段:HireDate
(属于 教授
类型)和 EnrollmentDate
(属于 学生
类型)。该表还包括一个名为 PersonType
的整数鉴别器字段。当 PersonType
等于 1
时,人员类型为 教授
,当它为 2
时,类型为 学生
。
TPH 示例
以下步骤将帮助您了解如何创建 TPH 继承映射。我将使用我展示的第一个图的确切数据库。
步骤 1
第一步是从数据库创建实体数据模型。这是我将在示例中使用的 EDM

我们将仅使用 Person
实体进行 TPH 演示。
第二步
从设计器表面,使用 添加 –> 实体 并添加两个实体:教授
和 学生
。
将 Person
实体设为它们的基类型。

之后,模型应该看起来像
步骤 3
将 HireDate
属性移动到 教授
实体,将 EnrollmentDate
属性移动到 学生
实体。同时从 Person
中删除 PersonType
属性,因为它将成为我们的鉴别器字段。

步骤 4
在映射详细信息视图中,将 学生
实体和 教授
实体映射到 Person
表。同时将相关属性映射到数据库中的字段。下图显示了如何映射学生实体
步骤 5
使用映射详细信息视图为实体添加一个条件。该条件应位于 PersonType
字段上,并应指示如果 PersonType
等于 1
,则该人是 教授
类型,如果 PersonType
等于 2
,则该人类型为 学生
。下图显示了如何在 学生
类型中执行此操作
步骤 6
由于 Person
是一个抽象类型,我们需要指明它是 abstract
的。指向 Person
实体并按 F4 打开其属性对话框。在对话框中,将 abstract
标志设置为 True
。
步骤 7
测试继承映射。以下代码将打印数据库中的人员数量以及教授和学生的数量
using (var context = new SchoolEntities())
{
var query = from person in context.People
select person;
Console.WriteLine("All People: " + query.Count().ToString());
var query1 = from student in context.People.OfType<Student>()
select student;
Console.WriteLine("Students: " + query1.Count().ToString());
var query2 = from proffesor in context.People.OfType<Professor>()
select proffesor;
Console.WriteLine("Professors: " + query2.Count().ToString());
}
摘要
总结一下。在本文中,我解释了什么是表每层次结构继承,并展示了我们如何在特定模型中创建该继承。TPH 的使用很常见,有时会导致非常大的表,其中包含很多字段。由于创建非常大的表是不良习惯,因此我建议将 TPH 与 TPT 一起使用。
历史
- 2010 年 7 月 23 日:初始发布