通过


枚举支持 - 代码优先

注释

仅限 EF5 - 本页中讨论的功能、API 等是在实体框架 5 中首次引入的。 如果使用早期版本,某些或全部信息不适用。

本视频和分步演练演示如何将枚举类型与 Entity Framework Code First 配合使用。 它还演示如何在 LINQ 查询中使用枚举。

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

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

在 Entity Framework 中,枚举可以具有以下基础类型: ByteInt16Int32Int64SByte

观看视频

此视频演示如何将枚举类型与 Entity Framework Code First 配合使用。 它还演示如何在 LINQ 查询中使用枚举。

作者:朱莉娅·科尔尼奇

视频WMV | MP4 | WMV (ZIP)

先决条件

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

 

设置项目

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

使用 Code First 定义新模型

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

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

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

public enum DepartmentNames
{
    English,
    Math,
    Economics
}     

public partial class Department
{
    public int DepartmentID { get; set; }
    public DepartmentNames Name { get; set; }
    public decimal Budget { get; set; }
}

 

定义 DbContext 派生类型

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

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

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

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

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

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

using System.Data.Entity;

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

public partial class EnumTestContext : DbContext
{
    public DbSet<Department> Departments { get; set; }
}

 

持久保存和检索数据

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

using (var context = new EnumTestContext())
{
    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} Name: {1}",
        department.DepartmentID,  
        department.Name);
}

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

DepartmentID: 1 Name: English

 

查看生成的数据库

首次运行应用程序时,Entity Framework 会为你创建一个数据库。 由于已安装 Visual Studio 2012,因此将在 LocalDB 实例上创建数据库。 默认情况下,Entity Framework 将数据库命名为派生上下文的完全限定名称(在本示例中为 EnumCodeFirst.EnumTestContext)。 未来使用现有数据库的时间。  

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

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

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

总结

在本演练中,我们介绍了如何将枚举类型与 Entity Framework Code First 配合使用。