Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Mova para o EF6 no .NET Core se ainda não tiver feito isso.
- Migre uma pequena parte do seu aplicativo para o EF Core e execute-o lado a lado com o EF6.
- 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:
- Examine as alterações de comportamento entre o EF6 e o EF Core.
- Execute suas migrações finais, se houver, no EF6.
- Crie seu projeto do EF Core.
- Copie o código para o novo projeto, execute engenharia reversa ou uma combinação de ambos.
- Renomeie referências e entidades e atualize comportamentos.
-
System.Data.EntityaMicrosoft.EntityFrameworkCore - Alterar o construtor
DbContextpara consumir opções e/ou substituirOnConfiguring -
DbModelBuilderaModelBuilder - Renomear
DbEntityEntry<T>paraEntityEntry<T> - Mover de
Database.LogparaMicrosoft.Extensions.LoggingAPIs (avançadas) ouDbContextOptionsBuilder.LogTo(simples) - Aplicar alterações para
WithRequiredeWithOptional(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.
-
- 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.