实体框架 - 继承
继承使创建复杂模型成为可能,这些模型可以更好地反映开发人员的思维方式,同时还可以减少与这些模型交互所需的工作。用于实体的继承与用于类的继承具有相同的用途,因此开发人员已经了解此功能的基本工作原理。
让我们通过创建一个新的控制台应用程序项目来查看以下示例。
步骤 1 − 通过右键单击项目名称并选择添加 → 新项目... 来添加 ADO.NET 实体数据模型
步骤 2 − 按照"模型优先方法"一章中提到的所有步骤添加一个实体并将其命名为 Person。
步骤 3 −添加一些标量属性,如下图所示。
步骤 4 − 我们将添加另外两个实体 Student 和 Teacher,它们将从 Person 表中继承属性。
步骤 5 − 现在添加 Student 实体并从 Base type 组合框中选择 Person,如下图所示。
步骤 6 − 类似地添加 Teacher 实体。
步骤 7 −现在将 EnrollmentDate 标量属性添加到学生实体,将 HireDate 属性添加到教师实体。
步骤 8 − 让我们继续生成数据库。
步骤 9 − 右键单击设计图面并选择从模型生成数据库...
步骤 10 − 要创建新数据库,请单击新建连接...将打开以下对话框。单击确定。
步骤 11 − 单击完成。这将在项目中添加 *.edmx.sql 文件。您可以通过打开 .sql 文件在 Visual Studio 中执行 DDL 脚本。现在右键单击并选择执行。
步骤 12 − 转到服务器资源管理器,您将看到数据库已创建,其中包含三个指定的表。
步骤 13 − 您还可以看到以下域类也会自动生成。
public partial class Person {
public int ID { get; set; }
public string FirstMidName { get; set; }
public string LastName { get; set; }
}
public partial class Student : Person {
public System.DateTime EnrollmentDate { get; set; }
}
public partial class Teacher : Person {
public System.DateTime HireDate { get; set; }
}
以下是 Context 类。
public partial class InheritanceModelContainer : DbContext {
public InheritanceModelContainer() :
base("name = InheritanceModelContainer") {}
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Person> People { get; set; }
}
让我们将一些学生和教师添加到数据库中,然后从数据库中检索它。
class Program {
static void Main(string[] args) {
using (var context = new InheritanceModelContainer()) {
var student = new Student {
FirstMidName = "Meredith",
LastName = "Alonso",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(student);
var student1 = new Student {
FirstMidName = "Arturo",
LastName = "Anand",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(student1);
var techaer = new Teacher {
FirstMidName = "Peggy",
LastName = "Justice",
HireDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(techaer);
var techaer1 = new Teacher {
FirstMidName = "Yan",
LastName = "Li",
HireDate = DateTime.Parse(DateTime.Today.ToString())
};
context.People.Add(techaer1);
context.SaveChanges();
}
}
}
学生和教师已添加到数据库中。要检索学生和教师,需要使用 OfType 方法,该方法将返回与指定部门相关的学生和教师。
Console.WriteLine("All students in database");
Console.WriteLine("");
foreach (var student in context.People.OfType<Student>()) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID: {0}, Name: {1}, Enrollment Date {2} ",
student.ID, name, student.EnrollmentDate.ToString());
}
Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.WriteLine("");
Console.WriteLine("All teachers in database");
Console.WriteLine("");
foreach (var teacher in context.People.OfType<Teacher>()) {
string name = teacher.FirstMidName + " " + teacher.LastName;
Console.WriteLine("ID: {0}, Name: {1}, HireDate {2} ",
teacher.ID, name, teacher.HireDate.ToString());
}
Console.WriteLine("");
Console.WriteLine("************************************************************ *****");
Console.ReadKey();
在第一个查询中,当您使用 OfType<Student>() 时,您将无法访问 HireDate,因为 HireDate 属性是 Teacher 实体的一部分,同样,当您使用 OfType<Teacher>() 时,EnrollmentDate 属性将无法访问
执行上述代码时,您将收到以下输出−
All students in database ID: 1, Name: Meredith Alonso, Enrollment Date 10/30/2015 12:00:00 AM ID: 2, Name: Arturo Anand, Enrollment Date 10/30/2015 12:00:00 AM ***************************************************************** All teachers in database ID: 3, Name: Peggy Justice, HireDate 10/30/2015 12:00:00 AM ID: 4, Name: Yan Li, HireDate 10/30/2015 12:00:00 AM *****************************************************************
我们建议您逐步执行上述示例,以便更好地理解。

