Alterações de comportamento entre EF6 e EF Core

Esta é uma lista não exaustiva de alterações de comportamento entre EF6 e EF Core. É importante ter isto em conta ao portar a aplicação, pois podem alterar o comportamento da aplicação, mas não aparecerão como erros de compilação após a troca para o EF Core.

Isto serve como uma revisão de alto nível a considerar como parte do processo de portabilidade. Para instruções mais detalhadas, caso a caso, leia os casos detalhados.

DbSet.Add/Attach e comportamento do grafo

No EF6, chamar DbSet.Add() em uma entidade resulta numa pesquisa recursiva por todas as entidades referenciadas nas suas propriedades de navegação. Quaisquer entidades que sejam encontradas, e que não estejam já rastreadas pelo contexto, também são assinaladas como adicionadas. DbSet.Attach() comporta-se da mesma forma, exceto que todas as entidades estã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 Added estado.
  • Para entidades encontradas durante a pesquisa recursiva das propriedades de navegação:
    • Se a chave primária da entidade for gerada por armazenamento
      • Se a chave primária não estiver definida para um valor, o estado é definido como somado. O valor da chave primária é considerado "não definido" se lhe for atribuído o valor padrão CLR para o tipo de propriedade (por exemplo, 0 para int, null para string, etc.).
      • Se a chave primária for definida para um valor, o estado fica inalterado.
    • Se a chave primária não for gerada pela base de dados, a entidade é colocada no mesmo estado da raiz.
  • Esta mudança de comportamento aplica-se apenas aos grupos de métodos Attach e Update. Add coloca sempre entidades no Added estado, mesmo que a chave esteja definida.
  • Attach os métodos inserem entidades que têm chaves definidas no estado Unchanged. Isto facilita o processo de "inserir se for novo, caso contrário, deixar como está." Os métodos Update colocam entidades com chaves definidas no estado Modified. Isto facilita o "inserir se for novo, caso contrário atualizar."

A filosofia geral aqui é que Update é uma forma muito simples de lidar com inserções e atualizações de entidades desconectadas. Garante que quaisquer novas entidades são inseridas e quaisquer entidades existentes são atualizadas.

Ao mesmo tempo, Add ainda fornece uma forma fácil de forçar a inserção de entidades. Adicionar é principalmente útil apenas quando não se usam chaves geradas pela loja, de modo que o EF não sabe se a entidade é nova ou não.

Para mais informações sobre estes comportamentos no EF Core, leia Change Tracking in EF Core.

Inicialização da base de dados Code First

O EF6 tem uma quantidade significativa de magia que realiza na seleção da ligação à base de dados e na inicialização da base de dados. Algumas destas regras incluem:

  • Se não for realizada qualquer configuração, o EF6 selecionará uma base de dados no SQL Express ou LocalDb.
  • Se uma string de ligação com o mesmo nome do contexto estiver no ficheiro da App/Web.config aplicação, essa ligação será utilizada.
  • Se a base de dados não existir, é criada.
  • Se nenhuma das tabelas do modelo existir na base de dados, o esquema do modelo atual é adicionado à base de dados. Se as migrações estiverem ativadas, então são usadas para criar a base de dados.
  • Se a base de dados existir e o EF6 tiver criado previamente o esquema, então o esquema é verificado quanto à compatibilidade com o modelo atual. É feita uma exceção se o modelo tiver mudado desde a criação do esquema.

O EF Core não realiza nenhuma destas magias.

  • A ligação à base de dados deve estar explicitamente configurada em código.
  • Não é realizada qualquer inicialização. Deve usar DbContext.Database.Migrate() para aplicar migrações (ou DbContext.Database.EnsureCreated() e EnsureDeleted() para criar/apagar a base de dados sem usar migrações).

Convenção de nomenclatura de tabelas Code First

O EF6 executa o nome da classe da entidade através de um serviço de pluralização para calcular o nome da tabela padrão para o qual a entidade está mapeada.

O EF Core utiliza o nome da propriedade DbSet à qual a entidade está exposta no contexto derivado. Se a entidade não tiver uma DbSet propriedade, então utiliza-se o nome da classe.

Para mais informações, leia Gestão de Esquemas de Base de Dados.