实体框架 - 迁移

在 Entity Framework 5 和之前版本的 Entity Framework 中,代码被拆分为核心库(主要是 System.Data.Entity.dll),作为 .NET Framework 的一部分提供,而其他库(主要是 EntityFramework.dll)则使用 NuGet 进行分发和发布,如下图所示。

DotNet Framework

在 Entity Framework 6 中,之前作为 .NET Framework 一部分的核心 API 也作为 NuGet 包的一部分提供和分发。

核心 API

这是使 Entity Framework 开源所必需的。但是,因此,每当需要将应用程序从旧版本的 Entity Framework 迁移或升级到 EF 6 时,都需要重建应用程序。

如果您的应用程序使用 DbContext(EF 4.1 及更高版本中附带),则迁移过程非常简单。但是,如果您的应用程序是 ObjectContext,则需要做更多工作。

让我们看一下将现有应用程序升级到 EF6 需要执行的以下步骤。

步骤 1 − 第一步是针对 .NET Framework 4.5.2 及更高版本,右键单击您的项目并选择属性。

升级 EF6

步骤 2 −再次右键单击您的项目并选择管理 NuGet 包...

管理 NuGet 包

步骤 3 − 在"在线"选项卡下,选择 EntityFramework 并单击"安装"。确保已删除对 System.Data.Entity.dll 的程序集引用。

当您安装 EF6 NuGet 包时,它会自动从您的项目中删除对 System.Data.Entity 的任何引用。

步骤 4 − 如果您有任何使用 EF Designer 创建的模型,那么您还需要更新代码生成模板以生成与 EF6 兼容的代码。

步骤 5 −在 edmx 文件下的解决方案资源管理器中,删除现有的代码生成模板,这些模板通常命名为 <edmx_file_name>.tt 和 <edmx_file_name>.Context.tt。

Edmx

步骤 6 − 在 EF Designer 中打开您的模型,右键单击设计图面并选择"添加代码生成项..."

步骤 7 − 添加适当的 EF 6.x 代码生成模板。

代码生成模板

它还将自动生成与 EF6 兼容的代码。

如果您的应用程序使用 EF 4.1 或更高版本,则无需更改代码中的任何内容,因为 DbContext 和 Code First 类型的命名空间没有更改。

但是,如果您的应用程序使用的是旧版本的 Entity Framework,那么之前位于 System.Data.Entity.dll 中的 ObjectContext 等类型已被移至新的命名空间。

步骤 8 −您需要更新使用或导入指令以针对 EF6 进行构建。

命名空间更改的一般规则是 System.Data.* 中的任何类型都会移至 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.EntityState ⇒ System.Data.Entity.EntityState
  • System.Data.Objects.DataClasses.EdmFunctionAttribute ⇒ System.Data.Entity.DbFunctionAttribute

您现有的 Entity Framework 项目将在 Entity Framework 6.0 中运行,无需进行任何重大更改。