Compartilhar via


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 seu DbContext local onde TEntity é 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 a Post e Blog 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.