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

Esta é uma lista não completa de alterações no comportamento entre o EF6 e o EF Core. É importante ter isso em mente ao portar seu aplicativo, pois isso pode mudar a maneira como seu aplicativo se comporta, mas não aparecerá como erros de compilação após a mudança para o EF Core.

Isso serve como 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 gráficos

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

O EF Core executa 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 automaticamente
      • Se a chave primária não estiver definida como um valor, o estado será definido como adicionado. O valor da chave primária será considerado "não definido" se 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 como 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 métodos dos grupos Attach e Update. Add sempre coloca entidades no Added estado, mesmo que a chave esteja definida.
  • Attach métodos inserem entidades cujas chaves estão definidas no estado Unchanged. Isso facilita "inseri-lo se novo, caso contrário, mantenha-o inalterado". Os Update métodos inserem entidades com chaves definidas no Modified estado. Isso facilita "inseri-lo se 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. Adicionar é útil principalmente somente quando não estiver usando chaves geradas pelo repositório, de modo que o EF não saiba 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 do banco de dados Code First

O EF6 tem uma quantidade significativa de magia executada em torno da seleção da conexão de banco de dados e da inicialização do banco de dados. Algumas dessas regras incluem:

  • Se nenhuma configuração for executada, 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 do App/Web.config aplicativo, essa conexão será usada.
  • 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á gerada se o modelo tiver sido alterado desde que o esquema foi criado.

O EF Core não executa nenhuma desta mágica.

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

Convenção de nomenclatura de tabelas do Code First

O EF6 executa o nome da classe de entidade por meio 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 usa o nome da DbSet propriedade na qual a entidade é exposta no contexto derivado. Se a entidade não tiver uma DbSet propriedade, o nome da classe será usado.

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