Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
Addedestado. -
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,
0paraint,nullparastring, etc.). - Se a chave primária for definida para um valor, o estado fica inalterado.
- 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,
- Se a chave primária não for gerada pela base de dados, a entidade é colocada no mesmo estado da raiz.
-
Se a chave primária da entidade for gerada por armazenamento
- Esta mudança de comportamento aplica-se apenas aos grupos de métodos
AttacheUpdate.Addcoloca sempre entidades noAddedestado, mesmo que a chave esteja definida. -
Attachos métodos inserem entidades que têm chaves definidas no estadoUnchanged. Isto facilita o processo de "inserir se for novo, caso contrário, deixar como está." Os métodosUpdatecolocam entidades com chaves definidas no estadoModified. 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.configaplicaçã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 (ouDbContext.Database.EnsureCreated()eEnsureDeleted()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.