Skip to main content

本视频和分步演示介绍在实体框架 Code First 环境下如何使用 enum 类型。还演示如何在 LINQ 查询中使用枚举。

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

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

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

更多视频选项 — 包括下载

 

必备条件

为完成本演练,需要安装 Visual Studio 2012 的旗舰版、高级版、专业版或 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 的 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)\v11.0,请在“SQL Server”上单击鼠标右键并选择“添加 SQL Server”。
    使用默认的“Windows 身份验证”连接 (localdb)\v11.0 服务器。
  3. 展开 (localdb)\v11.0
  4. 打开 Databases 文件夹查看新数据库,浏览到 Department 表。
    请注意,Code First 不创建映射到枚举类型的表。
  5. 要查看数据,请右键单击表,选择“查看数据”

摘要

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