枚举支持 - 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
先决条件
需要安装 Visual Studio 2012、Ultimate、Premium、Professional 或 Web Express Edition 才能完成本演练。
设置项目
- 打开 Visual Studio 2012
- 在“文件”菜单上指向“新建”,然后单击“项目”
- 在左侧窗格中,单击“Visual C#”,然后选择“控制台”模板
- 输入“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 的引用。
- 在解决方案资源管理器中,右键单击项目名称。
- 选择“管理 NuGet 包…”
- 在“管理 NuGet 包”对话框中,选择“联机”选项卡,然后选择 EntityFramework 包。
- 单击“安装”
请注意,除了 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。
若要查看数据库和数据,请执行以下操作:
- 在 Visual Studio 2012 主菜单中,选择“查看”->“SQL Server 对象资源管理器”。
- 如果 LocalDB 不在服务器列表中,请在“SQL Server”上单击鼠标右键并选择“添加 SQL Server”。使用默认的“Windows 身份验证”连接到 LocalDB 实例
- 展开 LocalDB 节点
- 展开 Databases 文件夹,查看新数据库并浏览到 Department 表 注意,Code First 不会创建映射到枚举类型的表
- 若要查看数据,请右键单击表,然后选择“查看数据”
总结
在本演练中,我们研究了如何通过 Entity Framework Code First 使用枚举类型。