Compartilhar via


Migrar do EF6 para o EF Core

O Entity Framework Core, ou EF Core, para abreviar, é uma reescrita total do Entity Framework para arquiteturas de aplicativos modernas. Devido a alterações fundamentais, não há um caminho de atualização direto. A finalidade desta documentação é fornecer um guia de ponta a ponta para portar seus aplicativos EF6 para o EF Core.

Importante

Antes de iniciar o processo de portabilidade, é importante validar que o EF Core atende aos requisitos de acesso a dados para seu aplicativo. Você pode encontrar tudo o que precisa na documentação do EF Core.

Aviso

O EF Core dá suporte apenas ao .NET moderno e não dá suporte ao .NET Framework. Dessa forma, se o projeto ainda estiver direcionando o .NET Framework, você precisará migrar para o .NET moderno antes de iniciar a migração do EF6 para o EF Core. Observe que o EF6 dá suporte ao .NET moderno, para que você possa migrar primeiro para o .NET moderno mantendo o EF6 e, em seguida, enfrentar a migração do EF6 para o EF Core.

Motivos para atualizar

Todo o novo desenvolvimento do Entity Framework está acontecendo no EF Core. Não há planos de adicionar novos recursos retroativamente ao EF6. O EF Core é executado nos runtimes mais recentes do .NET e aproveita ao máximo as funcionalidades dos runtimes, tanto específicas da plataforma (como ASP.NET Core ou WPF) quanto específicas da linguagem. Aqui estão alguns dos benefícios obtidos com a atualização:

  • Aproveite as melhorias de desempenho contínuas no EF Core. Por exemplo, um cliente que tenha migrado do EF6 para o EF Core 6 viu uma redução de 40x no uso de uma consulta pesada devido ao recurso de divisão de consulta. Muitos clientes relatam enormes ganhos de desempenho simplesmente movendo-se para o EF Core mais recente.
  • Use novos recursos no EF Core. Não haverá novos recursos adicionados ao EF6. Todas as novas funcionalidades, por exemplo, o provedor do Azure Cosmos DB e DbContextFactory, serão adicionadas apenas ao EF Core. Para obter uma comparação completa do EF6 com o EF Core, incluindo vários recursos exclusivos do EF Core, consulte: Comparar EF Core &EF6.
  • Modernize sua pilha de aplicativos usando a injeção de dependência e integre perfeitamente seu acesso a dados com tecnologias como gRPC e GraphQL.

Uma observação sobre migrações

Esta documentação usa os termos porta e atualização para evitar confusão com o termo migrações como um recurso do EF Core. As migrações no EF Core não são compatíveis com as migrações do EF6 Code First devido a melhorias significativas na forma como as migrações são tratadas. Não há uma abordagem recomendada para portar o histórico de migrações, portanto, planeje iniciar "fresco" no EF Core. Você pode manter a base de código e os dados de suas migrações EF6. Aplique sua migração final no EF6 e crie uma migração inicial no EF Core. Você poderá acompanhar o histórico no EF Core daqui para frente.

Etapas de atualização

O caminho de atualização foi dividido em vários documentos organizados pela fase da atualização e pelo tipo de aplicativo.

Determinar o "sabor" do EF Core

Há várias abordagens de como o EF Core funciona com seu modelo de domínio e implementação de banco de dados. Em geral, a maioria dos aplicativos seguirá um desses padrões, e a forma como você aborda sua porta dependerá da “variante” do aplicativo.

O código como fonte de verdade é uma abordagem na qual tudo é modelado por meio de código e classes, seja por meio de atributos de dados, configuração fluente ou uma combinação de ambos. O banco de dados é gerado inicialmente com base no modelo definido no EF Core e as atualizações adicionais normalmente são tratadas por meio de migrações. Isso é frequentemente chamado de "code first", mas o nome não é totalmente preciso porque uma das abordagens é começar com um banco de dados existente, gerar suas entidades e, em seguida, continuar a manutenção com código.

A abordagem Banco de dados como fonte de verdade envolve a engenharia reversa ou o scaffolding do código do banco de dados. Quando as alterações de esquema são feitas, o código é regenerado ou atualizado para refletir as alterações. Isso geralmente é chamado de "banco de dados primeiro".

Por fim, uma abordagem de mapeamento híbrido mais avançada segue a filosofia de que o código e o banco de dados são gerenciados separadamente e o EF Core é usado para mapear entre os dois. Essa abordagem normalmente evita migrações.

A tabela a seguir resume algumas diferenças de alto nível:

Aproximação Função de desenvolvedor Função DBA migrações Andaime Repositório
Código primeiro Criar entidades e verificar/personalizar migrações geradas Verificar definições e alterações de esquema Por confirmação Não aplicável Acompanhar entidades, DbContext e migrações
Banco de dados primeiro Faça engenharia reversa após as alterações e verifique as entidades geradas. Informar os desenvolvedores quando o banco de dados for alterado para re-scaffold Não aplicável Por alteração de esquema Acompanhar extensões/classes parciais que estendem as entidades geradas
Híbrido Atualizar a configuração fluente para mapear sempre que as entidades ou o banco de dados forem alterados Informe os desenvolvedores quando o banco de dados foi alterado para que eles possam atualizar entidades e configuração de modelo Não aplicável Não aplicável Acompanhar entidades e DbContext

A abordagem híbrida é uma abordagem mais avançada com sobrecarga adicional em comparação com as abordagens tradicionais de código e banco de dados.

Entender o impacto de se afastar do EDMX

O EF6 deu suporte a um formato especial de definição de modelo chamado Entity Data Model XML (EDMX). Os arquivos EDMX contêm várias definições, incluindo definições de esquema conceitual (CSDL), MSL (especificações de mapeamento) e SSDL (definições de esquema de armazenamento). O EF Core rastreia os esquemas de domínio, mapeamento e banco de dados por meio de grafos de modelo internos e não dá suporte ao formato EDMX. Muitas postagens e artigos de blog afirmam erroneamente que isso significa que o EF Core só dá suporte a "código primeiro". O EF Core dá suporte a todos os três modelos de aplicativo descritos na seção anterior. Você pode recompilar o modelo no EF Core fazendo engenharia reversa do banco de dados. Caso use o EDMX para uma representação visual do modelo de entidade, cogite usar as EF Core Power Tools de código aberto que fornecem recursos semelhantes para o EF Core.

Para obter mais informações sobre o impacto da falta de suporte para arquivos EDMX, leia o guia portabilidade do EDMX.

Executar as etapas de atualização

Não é um requisito portar todo o aplicativo. O EF6 e o EF Core podem ser executados no mesmo aplicativo (veja: usando EF Core e EF6 no mesmo aplicativo). Para minimizar o risco, você pode considerar:

  1. Mova para o EF6 no .NET Core se ainda não tiver feito isso.
  2. Migre uma pequena parte do seu aplicativo para o EF Core e execute-o lado a lado com o EF6.
  3. Eventualmente, traga o restante da base de código para o EF Core e desative o código EF6.

Quanto ao porte em si, em um alto nível, você vai:

  1. Examine as alterações de comportamento entre o EF6 e o EF Core.
  2. Execute suas migrações finais, se houver, no EF6.
  3. Crie seu projeto do EF Core.
  4. Copie o código para o novo projeto, execute engenharia reversa ou uma combinação de ambos.
  5. Renomeie referências e entidades e atualize comportamentos.
    • System.Data.Entity a Microsoft.EntityFrameworkCore
    • Alterar o construtor DbContext para consumir opções e/ou substituir OnConfiguring
    • DbModelBuilder a ModelBuilder
    • Renomear DbEntityEntry<T> para EntityEntry<T>
    • Mover de Database.Log para Microsoft.Extensions.Logging APIs (avançadas) ou DbContextOptionsBuilder.LogTo (simples)
    • Aplicar alterações para WithRequired e WithOptional (veja aqui)
    • Atualizar código de validação. Não há nenhuma validação de dados interna no EF Core, mas você pode fazer isso por conta própria.
    • Siga as etapas necessárias para portar a partir do EDMX.
  6. Execute etapas específicas com base na abordagem do EF Core:

Há muitas considerações relacionadas a todas as abordagens, portanto, você também desejará examinar maneiras de abordar e contornar as diferenças detalhadas entre o EF6 e o EF Core.