从 EF Core 1.0 RC1 升级到 1.0 RC2Upgrading from EF Core 1.0 RC1 to 1.0 RC2

本文介绍如何将使用 RC1 包生成的应用程序移动到 RC2。

包名称和版本Package Names and Versions

在 RC1 和 RC2 之间,我们将从 “实体框架 7” 改为 “Entity Framework Core”。 可以通过 Scott Hanselman 详细了解此帖子中的更改原因。 由于此更改,我们的包名称将从更改 EntityFramework.*Microsoft.EntityFrameworkCore.* ,从 7.0.0-rc1-final1.0.0-rc2-final (或 1.0.0-preview1-final 用于工具)的版本。

需要完全删除 RC1 包,然后安装 RC2 包。 下面是一些常用包的映射。

RC1 包RC2 等效项
EntityFramework. Microsoft sql server 7.0.0-rc1-finalMicrosoft.entityframeworkcore 1.0.0-rc2-最终
EntityFramework 7.0.0 版-rc1-最终Microsoft.entityframeworkcore 1.0.0-rc2-最终
EntityFramework7. Npgsql 3.1.0-rc1NpgSql. Microsoft.entityframeworkcore. Postgres
EntityFramework. SqlServerCompact35 7.0.0-rc1-finalMicrosoft.entityframeworkcore. SqlServerCompact35 1.0.0-rc2-最终
EntityFramework. SqlServerCompact40 7.0.0-rc1-finalMicrosoft.entityframeworkcore. SqlServerCompact40 1.0.0-rc2-最终
EntityFramework 7.0.0 版-rc1-最终Microsoft.entityframeworkcore 1.0.0-rc2-最终
EntityFramework. IBMDataServer 7.0.0-beta1尚不适用于 RC2
EntityFramework rc1-finalMicrosoft.entityframeworkcore 1.0.0-预览版 1-final
EntityFramework Microsoft sql server-rc1-finalMicrosoft.entityframeworkcore 1.0.0-rc2-最终

命名空间Namespaces

与包名称一起,命名空间从更改 Microsoft.Data.Entity.*Microsoft.EntityFrameworkCore.* 。 您可以使用的 “查找/替换” 来处理此更改 using Microsoft.Data.Entity using Microsoft.EntityFrameworkCore

表命名约定更改Table Naming Convention Changes

RC2 中的一个重要功能更改是将 DbSet<TEntity> 给定实体的属性名称用作其映射到的表名称,而不只是类名。 有关此更改的详细信息,请参阅相关公告问题

对于现有的 RC1 应用程序,我们建议将以下代码添加到方法的开头, OnModelCreating 以保留 RC1 命名策略:

  1. foreach (var entity in modelBuilder.Model.GetEntityTypes())
  2. {
  3. entity.Relational().TableName = entity.DisplayName();
  4. }

如果要采用新的命名策略,我们建议成功完成其余的升级步骤,并删除代码并创建迁移,以应用表重命名。

AddDbContext/Startup.cs 更改(仅 ASP.NET Core 项目)AddDbContext / Startup.cs Changes (ASP.NET Core Projects Only)

在 RC1 中,你必须将实体框架服务添加到应用程序服务提供程序中 Startup.ConfigureServices(...)

  1. services.AddEntityFramework()
  2. .AddSqlServer()
  3. .AddDbContext<ApplicationDbContext>(options =>
  4. options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));

在 RC2 中,你可以删除对、等的调用 AddEntityFramework() AddSqlServer()

  1. services.AddDbContext<ApplicationDbContext>(options =>
  2. options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));

还需要向派生上下文添加一个构造函数,该构造函数采用上下文选项,并将其传递到基构造函数。 这是必需的,因为我们消除了在幕后 snuck 它们的一些可怕的神奇之处:

  1. public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
  2. : base(options)
  3. {
  4. }

传入 IServiceProviderPassing in an IServiceProvider

如果你有将传递给上下文的 RC1 代码 IServiceProvider ,则此代码现在已移到 DbContextOptions ,而不是单独的构造函数参数。 使用 DbContextOptionsBuilder.UseInternalServiceProvider(...) 设置服务提供程序。

测试Testing

执行此操作的最常见方案是在测试时控制 InMemory 数据库的范围。 有关使用 RC2 执行此操作的示例,请参阅更新的测试文章。

从应用程序服务提供程序解析内部服务(仅 ASP.NET Core 项目)Resolving Internal Services from Application Service Provider (ASP.NET Core Projects Only)

如果你有一个 ASP.NET Core 应用程序,并且你希望 EF 解析应用程序服务提供程序中的内部服务,则有一个的重载, AddDbContext 它允许你配置以下内容:

  1. services.AddEntityFrameworkSqlServer()
  2. .AddDbContext<ApplicationDbContext>((serviceProvider, options) =>
  3. options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])
  4. .UseInternalServiceProvider(serviceProvider));

警告

建议允许 EF 内部管理其自己的服务,除非您有理由将内部 EF 服务合并到您的应用程序服务提供程序中。 你可能想要执行此操作的主要原因是使用应用程序服务提供程序来替换 EF 在内部使用的服务

DNX 命令 => .NET Core CLI (仅 ASP.NET Core 项目)DNX Commands => .NET Core CLI (ASP.NET Core Projects Only)

如果以前使用过 dnx ef ASP.NET 5 项目的命令,则这些命令现在已移动到 dotnet ef 命令。 相同的命令语法仍适用。 您可以使用 dotnet ef --help 来提供语法信息。

命令注册的方式在 RC2 中发生了更改,因为 DNX 被 .NET Core CLI 替换。 现在,命令在中的一个 tools 部分注册 project.json

  1. "tools": {
  2. "Microsoft.EntityFrameworkCore.Tools": {
  3. "version": "1.0.0-preview1-final",
  4. "imports": [
  5. "portable-net45+win8+dnxcore50",
  6. "portable-net45+win8"
  7. ]
  8. }
  9. }

提示

如果使用 Visual Studio,现在可以使用程序包管理器控制台来运行 ASP.NET Core 项目的 EF 命令(在 RC1 中不支持此操作)。 你仍需要注册的部分中的命令 tools project.json 来执行此操作。

程序包管理器命令需要 PowerShell 5Package Manager Commands Require PowerShell 5

如果你在 Visual Studio 中的包管理器控制台中使用实体框架命令,则需要确保已安装 PowerShell 5。 这是将在下一版本中删除的临时要求(有关详细信息,请参阅问题 #5327 )。

使用 project.js上的 “导入”Using “imports” in project.json

某些 EF Core 的依赖项尚不支持 .NET Standard。 .NET Standard 和 .NET Core 项目中的 EF Core 可能需要将 “导入” 添加到 project.js上以作为临时解决方法。

添加 EF 时,NuGet 还原将显示以下错误消息:

  1. Package Ix-Async 1.2.5 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package Ix-Async 1.2.5 supports:
  2. - net40 (.NETFramework,Version=v4.0)
  3. - net45 (.NETFramework,Version=v4.5)
  4. - portable-net45+win8+wp8 (.NETPortable,Version=v0.0,Profile=Profile78)
  5. Package Remotion.Linq 2.0.2 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package Remotion.Linq 2.0.2 supports:
  6. - net35 (.NETFramework,Version=v3.5)
  7. - net40 (.NETFramework,Version=v4.0)
  8. - net45 (.NETFramework,Version=v4.5)
  9. - portable-net45+win8+wp8+wpa81 (.NETPortable,Version=v0.0,Profile=Profile259)

解决方法是手动导入可移植配置文件 “net451 + win8”。 这会强制 NuGet 将与此提供的二进制文件相匹配的二进制文件视为与 .NET Standard 兼容的框架,即使它们不是这样。 尽管 “net451 + win8” 与 .NET Standard 的兼容性不是100%,但其兼容性足以用于从 PCL 转换到 .NET Standard。 当 EF 的依赖项最终升级到 .NET Standard 时,可以删除导入。

可以在数组语法中将多个框架添加到 “导入”。 如果将其他库添加到项目,则可能需要其他导入。

  1. {
  2. "frameworks": {
  3. "netcoreapp1.0": {
  4. "imports": ["dnxcore50", "portable-net451+win8"]
  5. }
  6. }
  7. }

请参阅问题 #5176