Casos detalhados para portabilidade de EF6 para EF Core
Este documento detalha algumas diferenças específicas entre o EF6 e o EF Core. Consulte este guia ao portar seu código.
Configurando a conexão de banco de dados
Há várias diferenças entre como o EF6 se conecta a várias fontes de dados em comparação com o EF Core. Eles são importantes para entender quando você porta seu código.
- Cadeias de conexão: O EF Core não dá suporte diretamente a várias sobrecargas de construtor para cadeias de conexão diferentes como o EF6. Em vez disso, ele depende de DbContextOptions. Você ainda pode fornecer várias sobrecargas de construtor em tipos derivados, mas precisará mapear conexões por meio das opções.
- Configuração e cache: O EF Core dá suporte a uma implementação mais robusta e flexível de injeção de dependência com uma infraestrutura interna que pode se conectar a provedores de serviços externos. Isso pode ser gerenciado pelo aplicativo para lidar com situações em que os caches devem ser liberados. A versão do EF6 era limitada e não podia ser liberada.
- Arquivos de configuração: O EF6 dá suporte à configuração por meio de arquivos de configuração que podem incluir o provedor. O EF Core requer uma referência direta ao assembly do provedor e ao registro do provedor explícito (ou seja
UseSqlServer
). - Fábricas de conexões: Fábricas de conexões compatíveis com EF6. O EF Core não dá suporte a fábricas de conexões e sempre requer uma cadeia de conexão.
- Registro em log: em geral, o registro em log no EF Core é muito mais robusto e tem várias opções para configuração ajustada.
Convenções
Convenções de modelo e convenções personalizadas ("leves") compatíveis com EF6. As convenções leves são semelhantes à configuração do modelo de pré-convenção do EF Core. Há suporte para outras convenções como parte da criação de modelos.
O EF6 executa convenções após a criação do modelo. O EF Core aplica-os à medida que o modelo está sendo criado. No EF Core, você pode desacoplar a criação de modelos de sessões ativas com um DbContext. É possível criar um modelo inicializado com as convenções.
Validação de dados
O EF Core não dá suporte à validação de dados e usa apenas anotações de dados para criar o modelo e as migrações. A maioria das bibliotecas de clientes da Web/MVC para WinForms e WPF fornece uma implementação de validação de dados a ser usada.
Recursos que serão adicionados em breve
Há alguns recursos no EF6 que ainda não existem no EF Core, mas estão no roteiro do produto.
- O TPC (tipo de tabela por concreto) era compatível com o EF6, juntamente com a "divisão de entidade". O TPC está no roteiro do EF7.
- O mapeamento de procedimentos armazenados no EF6 permite delegar operações de criação, atualização e exclusão para procedimentos armazenados. Atualmente, o EF Core só permite o mapeamento para procedimentos armazenados para leituras. O suporte a CUD (criar, atualizar e excluir) está no roteiro do EF7.
- Tipos complexos no EF6 são semelhantes aos tipos de propriedade no EF Core. No entanto, o conjunto completo de recursos será abordado com objetos de valor no EF7.
Deixar ObjectContext para trás
O EF Core usa um DbContext em vez de um ObjectContext
. Você precisará atualizar o código que usa IObjectContextAdapter. Às vezes, isso era usado para consultas com opção de mesclagem PreserveChanges
ou OverwriteChanges
. Para recursos semelhantes no EF Core, examine o método Reload.
Configuração do modelo
Há muitas diferenças importantes entre a forma como os modelos no EF6 e no EF Core são projetados. O EF Core não tem suporte total para mapeamento condicional. Ele não tem versões do construtor de modelos.
Outras diferenças incluem:
Descoberta de tipo
No EF Core, os Tipos de Entidade são descobertos pelo mecanismo de três maneiras:
- Exponha um
DbSet<TEntity>
em seuDbContext
local ondeTEntity
é o tipo que você deseja rastrear. - Faça referência a um
Set<TEntity>
de algum lugar em seu código. - Tipos complexos referenciados por tipos descobertos são descobertos recursivamente (por exemplo, se suas referências
Blog
aPost
eBlog
forem detectáveis,Post
também serão descobertos)
Assemblies não são verificados em busca de tipos derivados.
Mapeamento
A extensão .Map()
no EF6 foi substituída por sobrecargas e métodos de extensão no EF Core. Por exemplo, você pode usar '.HasDiscriminator()` para configurar o TPH (tabela por hierarquia). Veja: Herança de modelagem.
Mapeamento de herança
TPH (tabela por hierarquia) compatível com EF6, TPT (tabela por tipo) e TPC (table-per-concrete-class) e mapeamento híbrido habilitado de diferentes sabores em diferentes níveis da hierarquia. O EF Core continuará a exigir que uma cadeia de herança seja modelada de uma maneira (TPT ou TPH) e o plano é adicionar suporte ao TPC no EF7.
Veja: Herança de modelagem.
Atributos
Atributos de índice compatíveis com EF6 em propriedades. No EF Core, eles são aplicados no nível de tipo, o que deve facilitar os cenários que exigem índices compostos. O EF Core não dá suporte a chaves compostas com anotações de dados (ou seja, usar Order em ColumnAttribute
em conjunto com KeyAttribute
).
Para obter mais informações, consulte: Índices e restrições.
Obrigatório e opcional
Na criação de modelo do EF Core, IsRequired
configura apenas o que é necessário na extremidade principal. HasForeignKey
agora configura o final da entidade de segurança. Para portar seu código, será mais simples usar .Navigation().IsRequired()
em vez disso. Por exemplo:
EF6:
modelBuilder.Entity<Instructor>()
.HasRequired(t => t.OfficeAssignment)
.WithRequiredPrincipal(t => t.Instructor);
EF Core 6:
modelBuilder.Entity<Instructor>()
.HasOne(t => t.OfficeAssignment)
.WithOne(t => t.Instructor)
.HasForeignKey<OfficeAssignment>();
modelBuilder.Entity<Instructor>()
.Navigation(t => t.OfficeAssignment)
.IsRequired();
modelBuilder.Entity<OfficeAssignment>()
.Navigation(t => t.Instructor)
.IsRequired();
Por padrão, tudo é opcional, portanto, geralmente não é necessário chamar .IsRequired(false)
.
Suporte espacial
O EF Core integra-se à biblioteca da comunidade de bibliotecas de terceiros NetTopologySuite para fornecer suporte espacial.
Associações independentes
O EF Core não dá suporte a associações independentes (um conceito de EDM que permite que a relação entre duas entidades seja definida independente das próprias entidades). Um conceito semelhante com suporte no EF Core é propriedades de sombra.
Migrações
O EF Core não dá suporte a inicializadores de banco de dados ou migrações automáticas. Embora não haja nenhum migrate.exe
no EF Core, você pode produzir pacotes de migração.
Ferramentas do Visual Studio
O EF Core não tem nenhum designer, nenhuma funcionalidade para atualizar o modelo do banco de dados e nenhum fluxo de primeiro modelo. Não há nenhum assistente de engenharia reversa nem modelos internos.
Embora esses recursos não sejam fornecidos com o EF Core, há projetos de comunidade de OSS que fornecem ferramentas adicionais. Especificamente, o EF Core Power Tools fornece:
- Engenharia reversa de dentro do Visual Studio com suporte para projetos de banco de dados (
.dacpac
). Inclui personalizações de código baseadas em modelo. - Inspeção visual do DbContext com grafo de modelo e script.
- Gerenciamento de migrações de dentro do Visual Studio usando uma GUI.
Para obter uma lista completa de ferramentas e extensões da comunidade, consulte: Ferramentas e Extensões do EF Core.
controle de alterações
Há várias diferenças entre como o EF6 e o EF Core lidam com o controle de alterações. Eles são resumidos na tabela a seguir:
Recurso | EF6 | EF Core |
---|---|---|
Estado da entidade | Adiciona/anexa gráfico inteiro | Dá suporte a navegações para entidades desanexadas |
Órfãos | Preservado | Excluído |
Entidades desconectadas e auto-controladas | Com suporte | Sem suporte |
Mutações | Executado em propriedades | Executado em campos de backup* |
Associação de dados | .Local |
.Local mais .ToObservableCollection ou .ToBindingList |
Detecção de alteração | Grafo completo | Por entidade |
* Por padrão, a notificação de propriedade não será disparada no EF Core, portanto, é importante configurar entidades de notificação.
Observe que o EF Core não chama a detecção de alterações automaticamente com a frequência que o EF6.
O EF Core apresenta um DebugView
detalhado para o rastreador de alterações. Para saber mais, leia Depuração do Rastreador de Alterações.
Consultas
O EF6 tem alguns recursos de consulta que não existem no EF Core. Estão incluídos:
- Alguns mapeamentos comuns de função C# e de função SQL.
- Interceptação da árvore de comandos para consultas e atualizações.
- Suporte para TVPs (parâmetros com valor de tabela).
O EF6 tem suporte interno para proxies de carregamento lento. Esse é um pacote de aceitação do EF Core (consulte Carregamento Lento de Dados Relacionados).
O EF Core permite que você redigir sobre o SQL bruto usando FromSQL
.