升级到实体框架 6
在以前的 EF 版本中,代码在作为 .NET Framework 一部分提供的核心库(主要是 System.Data.Entity.dll)和 NuGet 包中附带的带外 (OOB) 库(主要是 EntityFramework.dll)之间进行了拆分。 EF6 从核心库中获取代码并将其合并到 OOB 库中。 若要让 EF 成为开放源代码并能够以不同于 .NET Framework 的速度发展,就必须这样做。 如此一来,就需要针对移动的类型重新生成应用程序。
对于使用 EF 4.1 及更高版本附带的 DbContext 的应用程序来说,这应该很简单。 对于使用 ObjectContext 的应用程序来说,操作要复杂一点,但仍然不难做到。
下面提供了将现有应用程序升级到 EF6 所需执行的操作清单。
1. 安装 EF6 NuGet 包
需要升级到新的实体框架 6 运行时。
- 右键单击项目并选择“管理 NuGet 包...”
- 在“联机”选项卡下,选择“EntityFramework”并单击“安装”
注意
如果安装了早期版本的 EntityFramework NuGet 包,这会将其升级到 EF6。
或者,可以从包管理器控制台运行以下命令:
Install-Package EntityFramework
2. 确保删除对 System.Data.Entity.dll 的程序集引用
安装 EF6 NuGet 包应该会自动从项目中删除对 System.Data.Entity 的任何引用。
3. 交换任何 EF 设计器 (EDMX) 模型以使用 EF 6.x 代码生成
如果你有使用 EF 设计器创建的任何模型,则需要更新代码生成模板以生成 EF6 兼容代码。
注意
目前只有 EF 6.x DbContext 生成器模板可用于 Visual Studio 2012 和 2013。
删除现有的代码生成模板。 这些文件通常命名为 <edmx_file_name>.tt 和 <edmx_file_name>.Context.tt,并嵌套在解决方案资源管理器中的 edmx 文件下。 可以在解决方案资源管理器中选择模板,然后按 Del 键将其删除。
注意
在网站项目中,模板不会嵌套在 edmx 文件下,而是连同它一起列于解决方案资源管理器中。
注意
在 VB.NET 项目中,需要启用“显示所有文件”才能看到嵌套的模板文件。
添加适当的 EF 6.x 代码生成模板。 在 EF 设计器中打开模型,右键单击设计图面并选择“添加代码生成项...”
如果使用 DbContext API(推荐),“EF 6.x DbContext 生成器”将在“数据”选项卡下提供。
注意
如果使用 Visual Studio 2012,则需要安装 EF 6 工具才能拥有此模板。 有关详细信息,请参阅获取实体框架。
如果使用 ObjectContext API,则需要选择“联机”选项卡并搜索“EF 6.x EntityObject 生成器”。
如果对代码生成模板应用了任何自定义项,则需要将它们重新应用于更新的模板。
4. 更新所使用的任何核心 EF 类型的命名空间
DbContext 和 Code First 类型的命名空间没有发生变化。 这意味着对于使用 EF 4.1 或更高版本的许多应用程序,你无需更改任何内容。
以前位于 System.Data.Entity.dll 中的类型(例如 ObjectContext)已移至新的命名空间。 这意味着,你可能需要更新 using 或 Import 指令,以针对 EF6 进行生成。
命名空间更改的一般规则是,System.Data.* 中的任何类型都移至 System.Data.Entity.Core.*。 换而言之,只需在 System.Data 后面插入 Entity.Core.。 例如:
- System.Data.EntityException => System.Data.Entity.Core.EntityException
- System.Data.Objects.ObjectContext => System.Data.Entity.Core.Objects.ObjectContext
- System.Data.Objects.DataClasses.RelationshipManager => System.Data.Entity.Core.Objects.DataClasses.RelationshipManager
这些类型位于 Core 命名空间中,因为它们不直接用于大多数基于 DbContext 的应用程序。 一些属于 System.Data.Entity.dll 的类型仍然常用,并且直接用于基于 DbContext 的应用程序,因此尚未移至 Core 命名空间。 这些是:
- System.Data.EntityState => System.Data.Entity.EntityState
- System.Data.Objects.DataClasses.EdmFunctionAttribute => System.Data.Entity.DbFunctionAttribute
注意
此类已重命名;具有旧名称的类仍然存在并且有效,但它现在标记为已过时。
- System.Data.Objects.EntityFunctions => System.Data.Entity.DbFunctions
注意
此类已重命名;具有旧名称的类仍然存在并且有效,但它现在标记为已过时。
- 空间类(例如,DbGeography、DbGeometry)已从 System.Data.Spatial => System.Data.Entity.Spatial 移出
注意
System.Data 命名空间中的某些类型位于 System.Data.dll(不是 EF 程序集)中。 这些类型没有移动,因此它们的命名空间保持不变。