设计器表拆分Designer Table Splitting

本演练演示如何通过使用 Entity Framework Designer (EF 设计器)修改模型,将多个实体类型映射到单个表。

当使用延迟加载加载对象时,可能需要使用表拆分延迟加载某些属性。 您可以将可能包含大量数据的属性分成单独的实体,并且仅在需要时加载。

下图显示了在使用 EF 设计器时使用的主窗口。

EF 设计器

先决条件Prerequisites

若要完成此演练,您需要:

设置项目Set up the Project

本演练使用 Visual Studio 2012。

  • 打开 Visual Studio 2012。
  • “文件” 菜单上,指向 “新建” ,再单击 “项目”
  • 在左窗格中,单击 “Visual C#”,然后选择 “控制台应用程序” 模板。
  • 输入TableSplittingSample作为项目名称,然后单击 “确定”

基于 School 数据库创建模型Create a Model based on the School Database

  • 右键单击 “解决方案资源管理器中的项目名称,指向”添加“,然后单击”新建项“。
  • 从左侧菜单中选择 “数据“,然后在 “模板” 窗格中选择 “ ADO.NET 实体数据模型
  • 输入TableSplittingModel作为文件名,然后单击 “添加“。
  • 在 “选择模型内容” 对话框中,选择 “ 从数据库生成“,然后单击 “ 下一步”。
  • 单击 “新建连接”。 在 “连接属性” 对话框中,输入服务器名称(例如, (localdb)\mssqllocaldb),选择身份验证方法,为数据库名称键入 School ,然后单击 “确定” 。 “选择您的数据连接” 对话框将通过数据库连接设置进行更新。
  • 在 “选择数据库对象” 对话框中,展开 ““ “节点”,然后检查Person表。 这会将指定的表添加到School模型。
  • 单击 “ 完成“。

此时会显示 Entity Designer,它提供了用于编辑模型的设计图面。 您在 “ 选择数据库对象 “ 对话框中选择的所有对象都将添加到模型中。

将两个实体映射到单个表Map Two Entities to a Single Table

在本节中,您将把Person实体拆分为两个实体,然后将它们映射到一个表。

备注

Person实体不包含任何可能包含大量数据的属性;它仅用作示例。

  • 右键单击设计图面的空白区域,指向 “ 添加新项”,然后单击 “ 实体“。 此时将显示 “ 新建实体 “ 对话框。
  • 为 “ 实体名称“ 和 “ PersonID “ 键入 “ HireInfo “ 作为键属性名称。
  • 单击 “确定”
  • 新的实体类型创建完毕,并且显示在设计图面上。
  • 选择 人员 实体类型的 “ 雇佣日期” 属性,然后按Ctrl + X键。
  • 选择HireInfo 实体,并按Ctrl + V键。
  • 创建PersonHireInfo之间的关联。 为此,请右键单击设计图面的空白区域,指向 “ 添加新项”,然后单击 “ 关联“。
  • 此时将显示 “ 添加关联 “ 对话框。 默认情况下,指定PersonHireInfo名称。
  • 指定关系两端的重数1 (一)
  • “确定”

下一步需要 “窗口中的” 映射详细信息“。 如果看不到此窗口,请右键单击设计图面,然后选择 “映射详细信息“。

  • 选择 HireInfo 实体类型,然后在 “ 映射详细信息“ 窗口中单击 <添加表或视图>

  • <添加表或视图> 字段 “下拉列表中选择”人员“。 此列表包含所选实体可以映射到的表或视图。 默认情况下,应映射相应的属性。

    映射

  • 在设计图面上选择 “ PersonHireInfo “ 关联。

  • 右键单击设计图面上的关联,然后选择 “属性“。

  • 在 “属性“ 窗口中,选择 “引用约束“ 属性,然后单击省略号按钮。

  • 从 “主体“ 下拉列表中选择 “人员“。

  • “确定”

使用模型Use the Model

  • 将以下代码粘贴到 Main 方法中。
  1. using (var context = new SchoolEntities())
  2. {
  3. Person person = new Person()
  4. {
  5. FirstName = "Kimberly",
  6. LastName = "Morgan",
  7. Discriminator = "Instructor",
  8. };
  9. person.HireInfo = new HireInfo()
  10. {
  11. HireDate = DateTime.Now
  12. };
  13. // Add the new person to the context.
  14. context.People.Add(person);
  15. // Insert a row into the Person table.
  16. context.SaveChanges();
  17. // Execute a query against the Person table.
  18. // The query returns columns that map to the Person entity.
  19. var existingPerson = context.People.FirstOrDefault();
  20. // Execute a query against the Person table.
  21. // The query returns columns that map to the Instructor entity.
  22. var hireInfo = existingPerson.HireInfo;
  23. Console.WriteLine("{0} was hired on {1}",
  24. existingPerson.LastName, hireInfo.HireDate);
  25. }
  • 编译并运行该应用程序。

由于运行此应用程序,以下 T-sql 语句针对School数据库执行。

  • 执行上下文时,执行了以下插入操作。SaveChanges ()并结合PersonHireInfo实体中的数据

    插入

  • 执行上下文时,执行了以下SELECT 。FirstOrDefault ()并只选择映射到人员的列

    选择1

  • 在访问导航属性 existingPerson 的结果中执行了下面的SELECT语句,并只选择了映射到HireInfo的列

    选择2