Compartilhar via


Alterações de comportamento entre o EF6 e o EF Core

Esta é uma lista parcial de algumas alterações no comportamento entre o EF6 e o EF Core. É importante tê-las em mente ao portar seu aplicativo, já que elas podem mudar a forma como seu aplicativo se comporta, mas não aparecerão como erros de compilação após a troca para o EF Core.

Isso se destina a ser uma revisão de alto nível a ser considerada como parte do processo de portabilidade. Para obter instruções mais detalhadas, caso a caso, leia os casos detalhados.

Comportamento de DbSet.Add/Attach e graph

No EF6, chamar DbSet.Add() em uma entidade resulta em uma pesquisa recursiva de todas as entidades referenciadas em suas propriedades de navegação. Quaisquer entidades encontradas e que ainda não são rastreadas pelo contexto também são marcadas como adicionadas. O DbSet.Attach() se comporta da mesma forma, mas todas as entidades são marcadas como inalteradas.

O EF Core realiza uma pesquisa recursiva semelhante, mas com algumas regras ligeiramente diferentes.

  • Se a entidade raiz estiver configurada para uma chave gerada e a chave não estiver definida, ela será colocada no estado Added.
  • Para entidades encontradas durante a pesquisa recursiva de propriedades de navegação:
    • Se a chave primária da entidade for gerada pelo repositório
      • Se a chave primária não for definida com um valor, o estado será definido como adicionado. O valor da chave primária será considerado "não definido" se for atribuído a ele o valor padrão de CLR do tipo de propriedade (por exemplo, 0 para int, null para string etc.).
      • Se a chave primária for definida com um valor, o estado será definido como inalterado.
    • Se a chave primária não for gerada pelo banco de dados, a entidade será colocada no mesmo estado que a raiz.
  • Essa alteração de comportamento só se aplica aos grupos de métodos Attach e Update. Add sempre coloca entidades no estado Added, mesmo que a chave esteja definida.
  • Métodos Attach colocam entidades com chaves definidas no estado Unchanged. Isso facilita os métodos "insira-o se for novo, caso contrário, ignore-o". Os métodos Update colocam entidades com chaves definidas no estado Modified. Isso facilita "insira-o se for novo, caso contrário, atualize-o".

A filosofia geral aqui é que Update é uma maneira muito simples de lidar com inserções e atualizações de entidades desconectadas. Ele garante que todas as novas entidades sejam inseridas e que todas as entidades existentes sejam atualizadas.

Ao mesmo tempo, Add ainda fornece uma maneira fácil de forçar a inserção de entidades. Add é útil principalmente quando não se usa chaves geradas pelo armazenamento, de modo que o EF não sabe se a entidade é nova ou não.

Para obter mais informações sobre esses comportamentos no EF Core, leia Controle de Alterações no EF Core.

Inicialização de banco de dados Code First

O EF6 realiza uma quantidade significativa de mágica ao selecionar a conexão de banco de dados e inicializar o banco de dados. Essas regras incluem:

  • Se nenhuma configuração for realizada, o EF6 selecionará um banco de dados no SQL Express ou LocalDb.
  • Se uma cadeia de conexão com o mesmo nome que o contexto estiver no arquivo App/Web.config dos aplicativos, será usada essa conexão.
  • Se o banco de dados não existir, ele será criado.
  • Se nenhuma das tabelas do modelo existir no banco de dados, o esquema do modelo atual será adicionado ao banco de dados. Se as migrações estiverem habilitadas, elas serão usadas para criar o banco de dados.
  • Se o banco de dados existir e o EF6 tiver criado o esquema anteriormente, o esquema será verificado quanto à compatibilidade com o modelo atual. Uma exceção será lançada se o modelo tiver mudado desde a criação do esquema.

O EF Core não faz nenhuma parte dessa mágica.

  • A conexão de banco de dados precisa ser configurada explicitamente no código.
  • Nenhuma inicialização é realizada. Você deve usar DbContext.Database.Migrate() para aplicar migrações (ou DbContext.Database.EnsureCreated() e EnsureDeleted() para criar/excluir o banco de dados sem usar migrações).

Convenção de nomenclatura de tabela Code First

O EF6 executa o nome de classe da entidade por meio de um serviço de pluralização para calcular o nome de tabela padrão para a qual a entidade é mapeada.

O EF Core usa o nome da propriedade DbSet à qual a entidade é exposta no contexto derivado. Se a entidade não tiver uma propriedade DbSet, o nome de classe será usado.

Para obter mais informações, leia Gerenciamento de esquemas de banco de dados.