- 实体框架教程
- 实体框架 - 主页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体 F - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架-DbContext
- 实体框架 - 类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体 F - 代码优先方法
- 实体 F - 模型优先方法
- 实体 F - 数据库优先方法
- 实体框架 - DEV 方法
- 实体F——数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体 F - 存储过程
- 实体 F - 断开连接的实体
- 实体 F - 表值函数
- 实体框架 - 本机 SQL
- 实体框架 - 枚举支持
- 实体F - 异步查询
- 实体框架 - 持久性
- 实体 F - 投影查询
- 实体 F - 命令记录
- 实体F——命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 预加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体
- 实体 F - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注释
- 实体框架 - 流畅的 API
- 实体框架-种子数据库
- 实体 F - 代码优先迁移
- 实体 F - 多个 DbContext
- 实体 F - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用的资源
- 实体框架 - 讨论
实体框架 - 继承
继承使创建复杂模型成为可能,这些模型可以更好地反映开发人员的思维方式,并减少与这些模型交互所需的工作。用于实体的继承与用于类的继承具有相同的目的,因此开发人员已经了解此功能如何工作的基础知识。
让我们看一下下面的示例并创建一个新的控制台应用程序项目。
步骤 1 - 通过右键单击项目名称并选择添加 → 新项目...来添加 ADO.NET 实体数据模型
步骤 2 - 按照模型优先方法一章中提到的所有步骤添加一个实体并将其命名为 Person。
步骤 3 - 添加一些标量属性,如下图所示。
步骤 4 - 我们将添加另外两个实体Student和Teacher,它们将从 Person 表继承属性。
步骤 5 - 现在添加 Student 实体并从 Base type 组合框中选择 Person,如下图所示。
步骤 6 - 类似地添加教师实体。
步骤 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(); } } }
学生和教师已添加到数据库中。N要检索学生和教师,需要使用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}, \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<Teacher>()) { 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 属性是教师实体的一部分,同样,当您使用 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 *****************************************************************
我们建议您逐步执行上述示例,以便更好地理解。