枚举支持-Code FirstEnum Support - Code First

备注

EF5 仅向前-实体框架5中引入了本页中所述的功能、api 等。 如果使用的是早期版本,则部分或全部信息不适用。

此视频和分步演练演示了如何使用实体框架 Code First 的枚举类型。 它还演示了如何在 LINQ 查询中使用枚举。

本演练将使用 Code First 创建新数据库,但也可以使用Code First 映射到现有数据库

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

在实体框架中,枚举可以具有以下基础类型:ByteInt16Int32Int64SByte

观看视频Watch the video

此视频演示如何使用实体框架 Code First 的枚举类型。 它还演示了如何在 LINQ 查询中使用枚举。

主讲人:Julia Kornich

视频:WMV | MP4 | WMV (ZIP)

先决条件Pre-Requisites

你将需要安装 Visual Studio 2012、旗舰版、高级版、专业版或 Web Express edition 才能完成此演练。

设置项目Set up the Project

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

使用 Code First 定义新模型Define a New Model using Code First

使用 Code First 开发时,通常首先编写定义概念(域)模型 .NET Framework 类。 下面的代码定义了部门类。

该代码还定义了 DepartmentNames 枚举。 默认情况下,枚举的类型为int 。 部门类的 Name 属性为 DepartmentNames 类型。

打开 Program.cs 文件并粘贴以下类定义。

  1. public enum DepartmentNames
  2. {
  3. English,
  4. Math,
  5. Economics
  6. }
  7. public partial class Department
  8. {
  9. public int DepartmentID { get; set; }
  10. public DepartmentNames Name { get; set; }
  11. public decimal Budget { get; set; }
  12. }

定义 DbContext 派生类型Define the DbContext Derived Type

除了定义实体外,还需要定义派生自 DbContext 的类,并公开 DbSet 属性。 DbSet 属性使上下文知道要包括在模型中的类型。

DbContext 派生类型的实例在运行时管理实体对象,这包括使用数据库中的数据填充对象、更改跟踪以及将数据保存到数据库。

DbContext 和 DbSet 类型是在 EntityFramework 程序集中定义的。 我们将使用 EntityFramework NuGet 包添加对此 DLL 的引用。

  1. 在解决方案资源管理器中,右键单击项目名称。
  2. 选择 “管理 NuGet 包 …
  3. 在 “管理 NuGet 包” 对话框中,选择 “联机“ 选项卡,然后选择 “ EntityFramework “ 包。
  4. 单击“安装”

请注意,除 EntityFramework 程序集之外,还添加了对 System.componentmodel 和 DataAnnotations 程序集的引用。

在 Program.cs 文件的顶部,添加以下 using 语句:

  1. using System.Data.Entity;

在 Program.cs 中,添加上下文定义。

  1. public partial class EnumTestContext : DbContext
  2. {
  3. public DbSet<Department> Departments { get; set; }
  4. }

保留和检索数据Persist and Retrieve Data

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

  1. using (var context = new EnumTestContext())
  2. {
  3. context.Departments.Add(new Department { Name = DepartmentNames.English });
  4. context.SaveChanges();
  5. var department = (from d in context.Departments
  6. where d.Name == DepartmentNames.English
  7. select d).FirstOrDefault();
  8. Console.WriteLine(
  9. "DepartmentID: {0} Name: {1}",
  10. department.DepartmentID,
  11. department.Name);
  12. }

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

  1. DepartmentID: 1 Name: English

查看生成的数据库View the Generated Database

首次运行应用程序时,实体框架会为您创建一个数据库。 由于我们安装了 Visual Studio 2012,因此将在 LocalDB 实例上创建数据库。 默认情况下,实体框架在派生上下文的完全限定名称后命名数据库(在此示例中为EnumTestContext)。 随后将使用现有数据库的时间。

请注意,如果在创建数据库后对模型进行了任何更改,则应使用 Code First 迁移来更新数据库架构。 有关使用迁移的示例,请参阅Code First 到新的数据库

若要查看数据库和数据,请执行以下操作:

  1. 在 Visual Studio 2012 主菜单中,选择 “查看 -> SQL Server 对象资源管理器“。
  2. 如果 LocalDB 不在服务器列表中,请在SQL Server上单击鼠标右键按钮,然后选择 “添加 SQL Server使用默认Windows 身份验证连接到 LocalDB 实例
  3. 展开 LocalDB 节点
  4. 展开 “数据库“ 文件夹以查看新数据库并浏览到 “部门“ 表,该 Code First 不会创建映射到枚举类型的表
  5. 若要查看数据,请右键单击该表,然后选择 “查看数据

SummarySummary

在本演练中,我们介绍了如何使用实体框架 Code First 的枚举类型。