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 日:初始发布








