65.9K
CodeProject 正在变化。 阅读更多。
Home

Entity Framework 中的表继承

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (10投票s)

2010年7月23日

CPOL

3分钟阅读

viewsIcon

71301

本文解释了什么是表每层次结构继承,以及如何在 Entity Framework 中应用它。

引言

在第二个继承映射教程中,我将介绍表每层次结构TPH)继承映射。如果您想阅读我展示的第一个映射,请转到 这里表每类型文章。

表每层次结构定义

TPH中,继承树仅通过一个表创建。
TPH继承依赖于一个条件映射,该映射由一个条件定义,例如鉴别器数据库字段。该条件用于将记录定义为不同的类型。例如,在以下数据库模式中,Person 表包括一个 TPH 继承

Database Schema

正如您所看到的,该表包含来自两种不同类型的两个不同字段:HireDate(属于 教授 类型)和 EnrollmentDate(属于 学生 类型)。该表还包括一个名为 PersonType 的整数鉴别器字段。当 PersonType 等于 1 时,人员类型为 教授,当它为 2 时,类型为 学生

TPH 示例

以下步骤将帮助您了解如何创建 TPH 继承映射。我将使用我展示的第一个图的确切数据库。

步骤 1

第一步是从数据库创建实体数据模型。这是我将在示例中使用的 EDM

Entity Designer Diagram

我们将仅使用 Person 实体进行 TPH 演示。

第二步

从设计器表面,使用 添加 –> 实体 并添加两个实体:教授学生

Add New Entities

Person 实体设为它们的基类型。

Add Professor

之后,模型应该看起来像

Entity Designer Diagram 1

步骤 3

HireDate 属性移动到 教授 实体,将 EnrollmentDate 属性移动到 学生 实体。同时从 Person 中删除 PersonType 属性,因为它将成为我们的鉴别器字段。

Entity Designer Diagram 2

步骤 4

映射详细信息视图中,将 学生 实体和 教授 实体映射到 Person 表。同时将相关属性映射到数据库中的字段。下图显示了如何映射学生实体

Map The Student Entity

步骤 5

使用映射详细信息视图为实体添加一个条件。该条件应位于 PersonType 字段上,并应指示如果 PersonType 等于 1,则该人是 教授 类型,如果 PersonType 等于 2,则该人类型为 学生。下图显示了如何在 学生 类型中执行此操作
Add Condition

步骤 6

由于 Person 是一个抽象类型,我们需要指明它是 abstract 的。指向 Person 实体并按 F4 打开其属性对话框。在对话框中,将 abstract 标志设置为 True

Person Properties

步骤 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 的使用很常见,有时会导致非常大的表,其中包含很多字段。由于创建非常大的表是不良习惯,因此我建议将 TPHTPT 一起使用。

历史

  • 2010 年 7 月 23 日:初始发布
© . All rights reserved.