枚举支持 - Code First

注意

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

此视频和分步演练展示了如何通过 Entity Framework Code First 使用枚举类型。 它还演示了如何在 LINQ 查询中使用枚举。

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

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

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

观看视频

该视频展示了如何通过 Entity Framework Code First 使用枚举类型。 它还演示了如何在 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. 输入“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; }
}

 

保留和检索数据

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

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

 

查看生成的数据库

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

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

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

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

总结

在本演练中,我们研究了如何通过 Entity Framework Code First 使用枚举类型。