枚举支持 - EF 设计器

注意

仅限 EF5 及更高版本 - 此页面中讨论的功能、API 等已引入实体框架 5。 如果使用的是早期版本,则部分或全部信息不适用。

此视频和分步演练演示如何通过实体框架设计器使用枚举类型。 它还演示了如何在 LINQ 查询中使用枚举。

本演练将使用 Model First 来创建新的数据库,但也可将 EF 设计器与 Database First 工作流结合使用以映射到现有数据库。

实体框架 5 中引入了枚举支持。 若要使用枚举、空间数据类型和表值函数等新功能,必须面向 .NET Framework 4.5。 Visual Studio 2012 默认面向 .NET 4.5。

在实体框架中,枚举可以具有以下基础类型:Byte、Int16、Int32、Int64 或 SByte

观看视频

此视频演示如何通过 Entity Framework Designer 使用枚举类型。 它还演示了如何在 LINQ 查询中使用枚举。

主讲人:Julia Kornich

视频WMV | MP4 | WMV (ZIP)

先决条件

需要安装 Visual Studio 2012、Ultimate、Premium、Professional 或 Web Express Edition 才能完成本演练。

设置项目

  1. 打开 Visual Studio 2012
  2. 在“文件”菜单上指向“新建”,然后单击“项目”
  3. 在左侧窗格中,单击“Visual C#”,然后选择“控制台”模板
  4. 输入“EnumEFDesigner”作为项目名称,然后单击“确定”

使用 EF 设计器创建新模型

  1. 在“解决方案资源管理器”中右键单击该项目名称,指向“添加”,然后单击“新建项”
  2. 从左侧菜单中选择“数据”,然后在“模板”窗格中选择“ADO.NET 实体数据模型”
  3. 输入“EnumTestModel.edmx”作为文件名,然后单击“添加”
  4. 在“实体数据模型向导”页面的“选择模型内容”对话框中,选择“空模型”
  5. 单击“完成”

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

该向导执行下列操作:

  • 生成 EnumTestModel.edmx 文件,该文件定义概念模型、存储模型以及这两种模型之间的映射。 将 .edmx 文件的元数据项目处理属性设置为嵌入输出程序集中,以便将生成的元数据文件嵌入到程序集中。
  • 添加对以下程序集的引用:EntityFramework、System.ComponentModel.DataAnnotations 和 System.Data.Entity。
  • 创建 EnumTestModel.tt 和 EnumTestModel.Context.tt 文件,并添加在 .edmx 文件下。 这些 T4 模板文件会生成用于定义映射到 .edmx 模型中实体的 DbContext 派生类型和 POCO 类型的代码。

添加新的实体类型

  1. 右键单击设计图面的空白区域,选择“添加”->“实体”,将出现“新建实体”对话框
  2. 指定“Department”作为类型名称并指定“DepartmentID”作为键属性名称,将类型保留为“Int32”
  3. 单击 “确定”
  4. 右键单击实体并选择“添加新实体”->“标量属性”
  5. 将新属性重命名为“Name”
  6. 将新属性的类型更改为“Int32”(默认情况下,新属性的类型为 String 类型)。若要更改类型,请打开“属性”窗口,将“类型”属性更改为“Int32”
  7. 添加另一个标量属性并将其重命名为 “Budget”,然后将类型更改为“Decimal”

添加枚举类型

  1. 在 Entity Framework Designer 中,右键单击“名称”属性,然后选择“转换为枚举”

    Convert To Enum

  2. 在“添加枚举”对话框中,键入“DepartmentNames”作为枚举类型名称,将“基础类型”更改为“Int32”,然后将以下成员添加到类型:English、Math 和 Economics

    Add Enum Type

  3. 按“确定”

  4. 保存模型并生成项目

    注意

    生成模型时,错误列表中可能会出现有关未映射实体和相关实体的警告。 可以忽略这些警告,因为选择从模型生成数据库后,错误就会消失。

如果查看属性窗口,你会注意到 Name 属性的类型已更改为 DepartmentNames 并且新添加的枚举类型已添加到类型列表中

如果切换到“模型浏览器”窗口,则会看到“枚举类型”节点中也添加了该类型。

Model Browser

注意

还可以从此窗口添加新枚举类型,方法是单击鼠标右键并选择“添加枚举类型”。 创建类型后,该类型将显示在类型列表中,可以将其与属性相关联

从模型生成数据库

现在,可以根据模型生成数据库。

  1. 右键单击 Entity Designer 图面上的空白区域,然后选择“从模型生成数据库”
  2. 将显示“生成数据库”向导的“选择数据连接”对话框 单击“新建连接”按钮指定“(localdb)\mssqllocaldb”作为服务器名称,并指定“EnumTest”作为数据库,然后单击“确定”
  3. 将弹出一个对话框,询问是否要创建新数据库,请单击“是”
  4. 单击“下一步”,“创建数据库”向导将生成用于创建数据库的数据定义语言 (DDL)生成的 DDL 显示在“摘要和设置”对话框中 请注意,DDL 不包含映射到枚举类型的表的定义
  5. 单击“完成”单击“完成”并不会执行 DDL 脚本。
  6. “创建数据库”向导执行以下操作: 在 T-SQL 编辑器中打开 EnumTest.edmx.sql生成 EDMX 文件的存储架构和映射部分 将连接字符串信息添加到 App.config 文件中
  7. 在 T-SQL 编辑器中单击鼠标右键并选择“执行”将出现“连接到服务器”对话框,输入步骤 2 中的连接信息,然后单击“连接”
  8. 若要查看生成的架构,请在 SQL Server 对象资源管理器中右键单击数据库名称,然后选择“刷新”

保留和检索数据

打开 Program.cs 文件,其中定义了 Main 方法。 将以下代码添加到 Main 函数中。 该代码会将一个新的 Department 对象添加到上下文中。 然后,它会保存数据。 该代码还会执行一个 LINQ 查询,该查询返回名称为 DepartmentNames.English 的 Department。

using (var context = new EnumTestModelContainer())
{
    context.Departments.Add(new Department{ Name = DepartmentNames.English });

    context.SaveChanges();

    var department = (from d in context.Departments
                        where d.Name == DepartmentNames.English
                        select d).FirstOrDefault();

    Console.WriteLine(
        "DepartmentID: {0} and Name: {1}",
        department.DepartmentID,  
        department.Name);
}

编译并运行该应用程序。 该程序生成以下输出:

DepartmentID: 1 Name: English

若要查看数据库中的数据,请在 SQL Server 对象资源管理器中右键单击数据库名称,然后选择“刷新”。 然后,在表上单击鼠标右键并选择“查看数据”

总结

在本演练中,我们了解了如何使用 Entity Framework Designer 映射枚举类型以及如何在代码中使用枚举。