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
paraint
,null
parastring
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 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,
- Se a chave primária não for gerada pelo banco de dados, a entidade será colocada no mesmo estado que a raiz.
- Se a chave primária da entidade for gerada pelo repositório
- Essa alteração de comportamento só se aplica aos grupos de métodos
Attach
eUpdate
.Add
sempre coloca entidades no estadoAdded
, mesmo que a chave esteja definida. - Métodos
Attach
colocam entidades com chaves definidas no estadoUnchanged
. Isso facilita os métodos "insira-o se for novo, caso contrário, ignore-o". Os métodosUpdate
colocam entidades com chaves definidas no estadoModified
. 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 (ouDbContext.Database.EnsureCreated()
eEnsureDeleted()
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.