开发手册 欢迎您!
软件开发者资料库

Entity Framework - 继承

Entity Framework继承 - 从概述,体系结构,环境设置,数据库设置,数据模型,DbContext,类型,关系,生命周期,代码优先方法,模型优先方法,数据库优先方法,DEV方法,数据库操作,并发,学习实体框架事务,视图,索引,存储过程,断开连接的实体,表值函数,本机SQL,枚举支持,异步查询,持久性,投影查询,命令记录,命令拦截,空间数据类型,继承,迁移,渴望,懒惰,显式加载,验证,跟踪更改,彩色实体,第一个示例,数据注释,Fluent API,种子数据库,代码优先迁移,多个DbContext,嵌套实体类型。

继承可以创建复杂的模型,更好地反映开发人员的思考方式,并减少与这些模型交互所需的工作.与实体一起使用的继承与用于类的继承具有相同的目的,因此开发人员已经知道此功能如何工作的基础知识.

让我们看看下面的示例并创建一个新的控制台应用项目.

第1步 : 通过右键单击项目名称添加ADO.NET实体数据模型,然后选择Add → 新项目...

第2步 : 添加一个实体,并按照模型优先方法一章中提到的所有步骤命名为Person.

步骤3 : 添加一些标量属性,如下图所示.

添加标量属性

第4步 : 我们将添加另外两个实体学生教师,这将继承人员表中的属性.

步骤5 : 现在添加Student实体并从Base类型组合框中选择Person,如下图所示.

Base Type ComboBox

第6步 : 同样添加教师实体.

第7步 : 现在将EnrollmentDate标量属性添加到学生实体,将HireDate属性添加到教师实体.

EnrollmentDate

第8步 : 让我们继续生成数据库.

步骤9 : 右键单击设计图面并选择Generate Database from Model ...

Generate Database

第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 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();      }   }}

数据库中添加了学生和教师. NTo检索学生和教师,需要使用 OfType 方法,这将返回与指定部门相关的学生和教师.

Console.WriteLine("All students in database"); Console.WriteLine("");foreach (var student in context.People.OfType()) {   string name = student.FirstMidName + " " + student.LastName;   Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment 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()) {   string name = teacher.FirstMidName + " " + teacher.LastName;   Console.WriteLine("ID: {0}, Name: {1}, \tHireDate {2} ",       teacher.ID, name, teacher.HireDate.ToString()); }Console.WriteLine("");Console.WriteLine("************************************************************ *****");Console.ReadKey();

在第一个查询中,当您使用OfType< Student>()时,您将无法访问HireDate,因为HireDate属性是教师实体的一部分,类似的EnrollmentDate属性在您使用OfType< Teacher>()时无法访问

执行上述代码时,您将收到以下输出 :

All students in databaseID: 1, Name: Meredith Alonso,   Enrollment Date 10/30/2015 12:00:00 AMID: 2, Name: Arturo Anand,      Enrollment Date 10/30/2015 12:00:00 AM*****************************************************************  All teachers in databaseID: 3, Name: Peggy Justice,     HireDate 10/30/2015 12:00:00 AMID: 4, Name: Yan Li,    HireDate 10/30/2015 12:00:00 AM*****************************************************************

我们建议您逐步执行上述示例更好的erstanding.