冠军 发表于 2012-12-19 22:29:20

翻译:Contoso 大学

翻译:Contoso 大学 - 8 – 实现继承

<div id="cnblogs_post_body">By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's Web Platform & Tools Content Team.

原文地址:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application
全文目录:Contoso 大学 - 使用 EF Code First 创建 MVC 应用
在上一次教程中,你已经能够处理并发异常。这个教程将会展示如何在数据模型中实现继承。
在面向对象的程序设计中,你可以通过继承来清除冗余的代码。在这个教程中,你将要通过修改教师 Instructor 和学生 Student 类,以便使他们从包含类似 LastName 属性的 Person 类中派生。对于 Web 页面不需要任何改动,你需要修改一点代码,这些修改将会被自动反射到数据库中。


8-1单表继承 (Table-per-Hierarchy) 对类型表 (Table-per-Type) 继承


在面向对象的程序设计中,你可以通过对相关的类使用继承来使得工作更加简单。例如,教师 Instructor 和学生 Student 类在学校 School 数据模型中共享多个属性,带来了冗余的代码。
http://i1.asp.net/umbraco-beta-media/2578113/Windows-Live-Writer_58f5a93579b2_CC7B_Student_and_Instructor_classes_e7a32f99-8bc4-48ce-aeaf-216a18071a8b.png
假设你希望清除在教师 Instructor 和学生 Student 之间所共享的属性带来的冗余代码。可以创建一个 Person 基类,其中仅仅包含他们共享的属性,然后,使得教师 Instructor 和学生 Student 类从 Person 基类派生,如下图所示。
http://i1.asp.net/umbraco-beta-media/2578119/Windows-Live-Writer_58f5a93579b2_CC7B_Student_and_Instructor_classes_deriving_from_Person_class_671d708c-cbb8-454a-a8f8-c2d99439acd9.png

在数据库中这种继承结构可以有多种表现形式,可以创建一个名为 Person 的表,在这个独立的表中包含教师和学生所有的信息。既包括他们独自拥有的属性 ( 例如教师的 HireDate ,以及学生的 EnrollmentDate ),也包括它们共有的属性 ( 例如 LastName, FirstName )。通常你还需要一个用于识别当前类型的列 discriminator 来标识当前行的类型。( 在这里,标识列的内容为 Instructor 来表示教师,Student 来表示学生 )
http://i1.asp.net/umbraco-beta-media/2578125/Windows-Live-Writer_58f5a93579b2_CC7B_Table-per-hierarchy_example_244067cd-b451-4e9b-9595-793b9afca505.png
使用单个数据库表来生成实体继承结构的模式称为单表继承模式 TPH (table-per-hierarchy )。
另外一种方式是使得数据库看起来类似继承结构。例如,在 Person 表中仅仅包含他们共有的名字属性,而将不同的时间分别保存到独立的 Instructor 和 Student 表中。
http://i1.asp.net/umbraco-beta-media/2578131/Windows-Live-Writer_58f5a93579b2_CC7B_Table-per-type_inheritance.png
这种每种实体类对应一张数据库表的模式称为类型表 TPT继承 (table per type )。
在 EF 中,TPH 继承比 TPT 继承有更好的性能,因为 TPT 继承需要复杂的连接查询。这个教程演示如何实现 TPH 继承。你需要完成如下的步骤:

[*]创建 Person 类,将 Instructor 和 Student 类从 Person 类中派生
[*]在数据库上下文类中增加模型到数据库的映射代码
[*]将项目中的 InstructorID 和 StudentID 修改为使用 PersonID.
8-2创建 Person 类

在 Model 文件夹中,创建 Person.cs ,使用下面的代码替换原有的代码。
<div class="cnblogs_code">using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;namespace ContosoUniversity.Models{    public abstract class Person    {            public int PersonID { get; set; }      = "Last name is required.")]      ="Last Name")]      50)]      public string LastName { get; set; }      = "First name is required.")]      "FirstName")]      = "First Name")]      50)]      public string FirstMidName { get; set; }      public string FullName         {            get            {                return LastName + ", " + FirstMidName;            }      }    }}
页: [1]
查看完整版本: 翻译:Contoso 大学