A atualização do EF Core 1.0 RC1 para 1.0 RC2Upgrading from EF Core 1.0 RC1 to 1.0 RC2

Este artigo fornece diretrizes para mover um aplicativo compilado com os pacotes RC1 para RC2.This article provides guidance for moving an application built with the RC1 packages to RC2.

Versões e nomes de pacotePackage Names and Versions

Entre RC1 e RC2, é alterado de "Entity Framework 7" a "Entity Framework Core".Between RC1 and RC2, we changed from "Entity Framework 7" to "Entity Framework Core". Você pode ler mais sobre os motivos para que a alteração no esta postagem por Scott Hanselman.You can read more about the reasons for the change in this post by Scott Hanselman. Devido a essa alteração, os nomes de pacote é alterado de EntityFramework.* para Microsoft.EntityFrameworkCore.* e nossas versões de 7.0.0-rc1-final para 1.0.0-rc2-final (ou 1.0.0-preview1-final para ferramentas).Because of this change, our package names changed from EntityFramework.* to Microsoft.EntityFrameworkCore.* and our versions from 7.0.0-rc1-final to 1.0.0-rc2-final (or 1.0.0-preview1-final for tooling).

Você precisará remover completamente os pacotes RC1 e, em seguida, instale o RC2 aqueles.You will need to completely remove the RC1 packages and then install the RC2 ones. Aqui está o mapeamento para alguns pacotes comuns.Here is the mapping for some common packages.

Pacote do RC1RC1 Package RC2 equivalenteRC2 Equivalent
EntityFramework.MicrosoftSqlServer 7.0.0-rc1-finalEntityFramework.MicrosoftSqlServer 7.0.0-rc1-final Microsoft.EntityFrameworkCore.SqlServer 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.SqlServer 1.0.0-rc2-final
EntityFramework.SQLite 7.0.0-rc1-finalEntityFramework.SQLite 7.0.0-rc1-final Microsoft.EntityFrameworkCore.Sqlite 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.Sqlite 1.0.0-rc2-final
EntityFramework7.Npgsql 3.1.0-rc1-3EntityFramework7.Npgsql 3.1.0-rc1-3 NpgSql.EntityFrameworkCore.Postgres NpgSql.EntityFrameworkCore.Postgres
EntityFramework.SqlServerCompact35 7.0.0-rc1-finalEntityFramework.SqlServerCompact35 7.0.0-rc1-final EntityFrameworkCore.SqlServerCompact35 1.0.0-rc2-finalEntityFrameworkCore.SqlServerCompact35 1.0.0-rc2-final
EntityFramework.SqlServerCompact40 7.0.0-rc1-finalEntityFramework.SqlServerCompact40 7.0.0-rc1-final EntityFrameworkCore.SqlServerCompact40 1.0.0-rc2-finalEntityFrameworkCore.SqlServerCompact40 1.0.0-rc2-final
EntityFramework.InMemory 7.0.0-rc1-finalEntityFramework.InMemory 7.0.0-rc1-final Microsoft.EntityFrameworkCore.InMemory 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.InMemory 1.0.0-rc2-final
EntityFramework.IBMDataServer 7.0.0-beta1EntityFramework.IBMDataServer 7.0.0-beta1 Ainda não está disponível para RC2Not yet available for RC2
EntityFramework.Commands 7.0.0-rc1-finalEntityFramework.Commands 7.0.0-rc1-final Microsoft.EntityFrameworkCore.Tools 1.0.0-preview1-finalMicrosoft.EntityFrameworkCore.Tools 1.0.0-preview1-final
EntityFramework.MicrosoftSqlServer.Design 7.0.0-rc1-finalEntityFramework.MicrosoftSqlServer.Design 7.0.0-rc1-final Microsoft.EntityFrameworkCore.SqlServer.Design 1.0.0-rc2-finalMicrosoft.EntityFrameworkCore.SqlServer.Design 1.0.0-rc2-final

NamespacesNamespaces

Juntamente com os nomes de pacote, namespaces alterado de Microsoft.Data.Entity.* para Microsoft.EntityFrameworkCore.*.Along with package names, namespaces changed from Microsoft.Data.Entity.* to Microsoft.EntityFrameworkCore.*. Você pode lidar com essa alteração com um localizar/substituir de using Microsoft.Data.Entity com using Microsoft.EntityFrameworkCore.You can handle this change with a find/replace of using Microsoft.Data.Entity with using Microsoft.EntityFrameworkCore.

Tabela de alterações de convenção de nomenclaturaTable Naming Convention Changes

Uma alteração significativa de funcional que tomamos no RC2 era usar o nome do DbSet<TEntity> propriedade para uma determinada entidade como o nome da tabela que ele seja mapeado para, em vez de apenas o nome da classe.A significant functional change we took in RC2 was to use the name of the DbSet<TEntity> property for a given entity as the table name it maps to, rather than just the class name. Você pode ler mais sobre essa alteração no o problema de lançamento relacionados.You can read more about this change in the related announcement issue.

Para aplicativos existentes do RC1, é recomendável adicionar o código a seguir para o início da sua OnModelCreating método para manter a estratégia de nomenclatura RC1:For existing RC1 applications, we recommend adding the following code to the start of your OnModelCreating method to keep the RC1 naming strategy:

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

Se você desejar adotar a nova estratégia de nomenclatura, recomendamos com êxito renomeia concluir o restante das etapas de atualização e, em seguida, remover o código e a criação de uma migração para aplicar a tabela.If you want to adopt the new naming strategy, we would recommend successfully completing the rest of the upgrade steps and then removing the code and creating a migration to apply the table renames.

AddDbContext Startup.cs alterações (somente para projetos ASP.NET Core)AddDbContext / Startup.cs Changes (ASP.NET Core Projects Only)

No RC1, você precisava adicionar serviços do Entity Framework para o provedor de serviço de aplicativo - Startup.ConfigureServices(...):In RC1, you had to add Entity Framework services to the application service provider - in Startup.ConfigureServices(...):

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

No RC2, você pode remover as chamadas para AddEntityFramework(), AddSqlServer(), etc.:In RC2, you can remove the calls to AddEntityFramework(), AddSqlServer(), etc.:

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

Você também precisará adicionar um construtor para o contexto derivado, que usa opções de contexto e os passa para o construtor base.You also need to add a constructor, to your derived context, that takes context options and passes them to the base constructor. Isso é necessário porque removemos alguns mágica assustador que entrou furtivamente-los em segundo plano:This is needed because we removed some of the scary magic that snuck them in behind the scenes:

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{
}

Passar um IServiceProviderPassing in an IServiceProvider

Se você tiver código RC1 transmite um IServiceProvider para o contexto, isso agora foi movido para DbContextOptions, em vez de ser um parâmetro de construtor separado.If you have RC1 code that passes an IServiceProvider to the context, this has now moved to DbContextOptions, rather than being a separate constructor parameter. Use DbContextOptionsBuilder.UseInternalServiceProvider(...) para definir o provedor de serviço.Use DbContextOptionsBuilder.UseInternalServiceProvider(...) to set the service provider.

TestesTesting

O cenário mais comum para isso era controlar o escopo de um banco de dados InMemory durante o teste.The most common scenario for doing this was to control the scope of an InMemory database when testing. Consulte a atualização teste artigo para obter um exemplo de como fazer isso com RC2.See the updated Testing article for an example of doing this with RC2.

Resolvendo serviços internos do provedor de serviços de aplicativo (somente para projetos ASP.NET Core)Resolving Internal Services from Application Service Provider (ASP.NET Core Projects Only)

Se você tiver um aplicativo ASP.NET Core e você desejar EF para resolver serviços internos do provedor de serviço de aplicativo, há uma sobrecarga de AddDbContext que permite que você configure isso:If you have an ASP.NET Core application and you want EF to resolve internal services from the application service provider, there is an overload of AddDbContext that allows you to configure this:

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

Aviso

É recomendável permitir que o EF internamente gerenciar seus próprios serviços, a menos que você tenha um motivo para combinar os serviços EF internos em seu provedor de serviços de aplicativo.We recommend allowing EF to internally manage its own services, unless you have a reason to combine the internal EF services into your application service provider. O principal motivo que talvez você queira fazer isso é usar o provedor de serviços de aplicativo para substituir os serviços que o EF usa internamenteThe main reason you may want to do this is to use your application service provider to replace services that EF uses internally

Comandos do DNX = > .NET CLI (apenas para projetos ASP.NET Core)DNX Commands => .NET CLI (ASP.NET Core Projects Only)

Se você tiver usado o dnx ef comandos para projetos ASP.NET 5, eles agora foram movidas para dotnet ef comandos.If you previously used the dnx ef commands for ASP.NET 5 projects, these have now moved to dotnet ef commands. A mesma sintaxe de comando ainda se aplica.The same command syntax still applies. Você pode usar dotnet ef --help para obter informações de sintaxe.You can use dotnet ef --help for syntax information.

A maneira como os comandos são registrados foi alterado no RC2, devido a DNX está sendo substituída pela CLI do .NET.The way commands are registered has changed in RC2, due to DNX being replaced by .NET CLI. Comandos são registrados em um tools seção project.json:Commands are now registered in a tools section in project.json:

"tools": {
  "Microsoft.EntityFrameworkCore.Tools": {
    "version": "1.0.0-preview1-final",
    "imports": [
      "portable-net45+win8+dnxcore50",
      "portable-net45+win8"
    ]
  }
}

Dica

Se você usar o Visual Studio, agora você pode usar o Console do Gerenciador de pacotes para executar comandos EF para projetos ASP.NET Core (isso não era suportado no RC1).If you use Visual Studio, you can now use Package Manager Console to run EF commands for ASP.NET Core projects (this was not supported in RC1). Você ainda precisará registrar os comandos de tools seção project.json para fazer isso.You still need to register the commands in the tools section of project.json to do this.

Comandos do Gerenciador de pacote exigem o PowerShell 5Package Manager Commands Require PowerShell 5

Se você usar os comandos do Entity Framework no Console do Gerenciador de pacotes no Visual Studio, você precisará ter 5 PowerShell instalado.If you use the Entity Framework commands in Package Manager Console in Visual Studio, then you will need to ensure you have PowerShell 5 installed. Esse é um requisito temporário que será removido na próxima versão (consulte emitir #5327 para obter mais detalhes).This is a temporary requirement that will be removed in the next release (see issue #5327 for more details).

Usando "imports" no ProjectUsing "imports" in project.json

Algumas das dependências do EF Core ainda não suporta .NET padrão.Some of EF Core's dependencies do not support .NET Standard yet. EF Core em projetos do .NET padrão e .NET Core talvez seja necessário adicionar "importar" para Project como uma solução temporária.EF Core in .NET Standard and .NET Core projects may require adding "imports" to project.json as a temporary workaround.

Ao adicionar EF, a restauração do NuGet exibirá essa mensagem de erro:When adding EF, NuGet restore will display this error message:

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

A solução alternativa é importar manualmente o perfil portátil "portátil net451 + win8".The workaround is to manually import the portable profile "portable-net451+win8". Isso força o NuGet para tratar esse binários que correspondem a esse fornece como uma estrutura compatível com .NET padrão, mesmo que eles não são.This forces NuGet to treat this binaries that match this provide as a compatible framework with .NET Standard, even though they are not. Embora "portátil net451 + win8" não é 100% compatível com .NET padrão, é compatível para a transição do PCL para .NET padrão.Although "portable-net451+win8" is not 100% compatible with .NET Standard, it is compatible enough for the transition from PCL to .NET Standard. Importações podem ser removidas quando dependências do EF eventualmente atualizar para o .NET padrão.Imports can be removed when EF's dependencies eventually upgrade to .NET Standard.

Várias estruturas podem ser adicionadas para "imports" na sintaxe da matriz.Multiple frameworks can be added to "imports" in array syntax. Outras importações podem ser necessárias se você adicionar bibliotecas adicionais ao seu projeto.Other imports may be necessary if you add additional libraries to your project.

{
  "frameworks": {
    "netcoreapp1.0": {
      "imports": ["dnxcore50", "portable-net451+win8"]
    }
  }
}

Consulte emitir ᐸ.See Issue #5176.