Designer 实体拆分

本演练介绍如何通过使用 Entity Framework Designer (EF Designer) 修改模型来将实体类型映射到两个表。 如果多个表共享同一个键,则可以将一个实体映射到这些表。 适用于将一个实体类型映射到两个表的概念可以轻松扩展为将一个实体类型映射到两个以上的表。

下图显示了使用 EF Designer 时使用的主窗口。

EF Designer

先决条件

Visual Studio 2012 或 Visual Studio 2010、Ultimate、Premium、Professional 或 Web Express 版。

创建数据库

随 Visual Studio 安装的数据库服务器因你安装的 Visual Studio 版本而异:

  • 如果使用 Visual Studio 2012,你将创建一个 LocalDB 数据库。
  • 如果使用 Visual Studio 2010,你将创建一个 SQL Express 数据库。

首先,创建一个数据库,其中包含两个将合并为一个实体的表。

  • 打开 Visual Studio
  • “视图”->“服务器资源管理器”
  • 右键单击“数据连接”->“添加连接...”
  • 如果尚未从服务器资源管理器连接到数据库,则需要选择 Microsoft SQL Server 作为数据源
  • 连接 LocalDB 或 SQL Express,具体取决于安装的是哪一项
  • 输入 EntitySplitting 作为数据库名称
  • 选择“确定”,系统会询问你是否要创建新数据库,请选择“是”
  • 新数据库现在将出现在服务器资源管理器中
  • 如果你使用的是 Visual Studio 2012:
    • 右键单击服务器资源管理器中的数据库,然后选择“新建查询
    • 将以下 SQL 复制到新查询中,然后右键单击该查询并选择“执行”
  • 如果你使用的是 Visual Studio 2010:
    • 选择“数据”->“Transact SQL 编辑器”->“新建查询连接...”
    • 输入“.\SQLEXPRESS”作为服务器名称,然后单击“确定”
    • 从查询编辑器顶部的下拉列表中选择“EntitySplitting”数据库
    • 将以下 SQL 复制到新查询中,然后右键单击该查询并选择“执行 SQL”
CREATE TABLE [dbo].[Person] (
[PersonId] INT IDENTITY (1, 1) NOT NULL,
[FirstName] NVARCHAR (200) NULL,
[LastName] NVARCHAR (200) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC)
);

CREATE TABLE [dbo].[PersonInfo] (
[PersonId] INT NOT NULL,
[Email] NVARCHAR (200) NULL,
[Phone] NVARCHAR (50) NULL,
CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ([PersonId] ASC),
CONSTRAINT [FK_Person_PersonInfo] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([PersonId]) ON DELETE CASCADE
);

创建项目

  • “文件” 菜单上,指向 “新建” ,然后单击 “项目”
  • 在左侧窗格中,单击“Visual C#”,然后选择“控制台应用程序”模板
  • 输入 MapEntityToTablesSample 作为项目名称,然后单击“确定”
  • 如果系统提示保存在第一部分中创建的 SQL 查询,请单击“否”

创建基于数据库的模型

  • 在“解决方案资源管理器”中右键单击该项目的名称,指向“添加”,然后单击“新建项”
  • 从左侧菜单中选择“数据”,然后在“模板”窗格中选择“ADO.NET 实体数据模型”
  • 输入“MapEntityToTablesModel.edmx”作为文件名,然后单击“添加”
  • 在“选择模型内容”对话框中,选择“从数据库生成”,然后单击“下一步”
  • 从下拉列表中选择 EntitySplitting 连接,然后单击“下一步”
  • 在“选择数据库对象”对话框中,选中“表”节点旁边的对话框。 这会将所有表从 EntitySplitting 数据库添加到模型
  • 单击“完成” 。

将显示 Entity Designer,它提供用于编辑模型的设计图面。

将一个实体映射到两个表

在此步骤中,我们将更新“人员”实体类型,以合并来自“人员”和 PersonInfo 表的数据

  • 选择 PersonInfo 实体的“电子邮件”和“电话”属性,然后按 Ctrl+X 键****。

  • 选择“人员”实体并按 Ctrl+V 键****。

  • 在设计图面上,选择 PersonInfo 实体并按键盘上的“删除”按钮

  • 系统询问是否要从模型中删除 PersonInfo 表时,单击“否”,我们要将其映射到“人员”实体

    Delete Tables

下一步骤要求使用“映射详细信息”窗口。 如果没有出现此窗口,请右键单击设计图面,然后选择“映射详细信息”

  • 选择“人员”实体类型,然后单击“映射详细信息”窗口中的“<添加表或视图>”
  • 从下拉列表中选择“PersonInfo”****。 “映射详细信息”窗口将会更新适用于我们的方案的默认列映射

“人员”实体类型现在映射到“人员”和 PersonInfo 表

Mapping 2

使用模型

  • 在 Main 方法中粘贴以下代码。
    using (var context = new EntitySplittingEntities())
    {
        var person = new Person
        {
            FirstName = "John",
            LastName = "Doe",
            Email = "john@example.com",
            Phone = "555-555-5555"
        };

        context.People.Add(person);
        context.SaveChanges();

        foreach (var item in context.People)
        {
            Console.WriteLine(item.FirstName);
        }
    }
  • 编译并运行该应用程序。

运行此应用程序后会对数据库执行以下 T-SQL 语句。 

  • 执行 context.SaveChanges() 会执行以下两个 INSERT 语句。 这两个语句从“人员”实体获取数据并将其拆分到“人员”和 PersonInfo 表

    Insert 1

    Insert 2

  • 枚举数据库中的人员会执行以下 SELECT 语句。 这会合并来自“人员”和 PersonInfo 表的数据

    Select Combining Person and PersonInfo Data