Antes de portabilidade do EF6 para EF Core: validar os requisitos do aplicativoBefore porting from EF6 to EF Core: Validate your Application's Requirements

Antes de iniciar o processo de portabilidade é importante validar que o EF Core atende aos requisitos de acesso a dados para seu aplicativo.Before you start the porting process it is important to validate that EF Core meets the data access requirements for your application.

Recursos ausentesMissing features

Certifique-se de que o EF Core tem todos os recursos que você precisa usar em seu aplicativo.Make sure that EF Core has all the features you need to use in your application. Ver comparação de recursos para uma comparação detalhada de como o conjunto de recursos no EF Core se compara ao EF6.See Feature Comparison for a detailed comparison of how the feature set in EF Core compares to EF6. Se quaisquer recursos necessários estão ausentes, certifique-se de que você pode compensar a falta desses recursos antes de portar para EF Core.If any required features are missing, ensure that you can compensate for the lack of these features before porting to EF Core.

Alterações de comportamentoBehavior changes

Esta é uma lista parcial de algumas alterações no comportamento entre o EF6 e EF Core.This is a non-exhaustive list of some changes in behavior between EF6 and EF Core. É importante manter essas práticas como sua porta de seu aplicativo como eles podem alterar a maneira que seu aplicativo se comporta, mas não será exibida como erros de compilação após a troca para o EF Core.It is important to keep these in mind as your port your application as they may change the way your application behaves, but will not show up as compilation errors after swapping to EF Core.

Comportamento de DbSet.Add/Attach e grafoDbSet.Add/Attach and graph behavior

No EF6, chamar DbSet.Add() em resultados de uma entidade em uma pesquisa recursiva para todas as entidades referenciadas em suas propriedades de navegação.In EF6, calling DbSet.Add() on an entity results in a recursive search for all entities referenced in its navigation properties. Qualquer entidade que é encontrada e já não é controlada pelo contexto, também é marcadas como adicionadas.Any entities that are found, and are not already tracked by the context, are also be marked as added. DbSet.Attach() se comporta da mesma, exceto pelo fato de todas as entidades são marcadas como inalterado.DbSet.Attach() behaves the same, except all entities are marked as unchanged.

O EF Core executa uma pesquisa recursiva semelhante, mas com algumas regras ligeiramente diferentes.EF Core performs a similar recursive search, but with some slightly different rules.

  • A entidade raiz sempre está no estado solicitado (adicionado DbSet.Add e inalterado para DbSet.Attach).The root entity is always in the requested state (added for DbSet.Add and unchanged for DbSet.Attach).

  • Para entidades que são encontradas durante a pesquisa recursiva de propriedades de navegação:For entities that are found during the recursive search of navigation properties:

    • Se a chave primária da entidade é geradas pelo repositórioIf the primary key of the entity is store generated

      • Se a chave primária não está definida como um valor, o estado é definido como adicionado.If the primary key is not set to a value, the state is set to added. O valor de chave primária é considerado "não definido" se ele é atribuído o valor de padrão do CLR para o tipo de propriedade (por exemplo, 0 para int, null para string, etc.).The primary key value is considered "not set" if it is assigned the CLR default value for the property type (for example, 0 for int, null for string, etc.).

      • Se a chave primária é definida como um valor, o estado é definido como inalterado.If the primary key is set to a value, the state is set to unchanged.

    • Se a chave primária não é um banco de dados gerado, a entidade será colocada no mesmo estado, como a raiz.If the primary key is not database generated, the entity is put in the same state as the root.

Primeira inicialização do banco de dados de códigoCode First database initialization

EF6 tem uma quantidade significativa de mágica, que ele executa em torno de selecionar a conexão de banco de dados e inicializar o banco de dados. Algumas dessas regras incluem:EF6 has a significant amount of magic it performs around selecting the database connection and initializing the database. Some of these rules include:

  • Se nenhuma configuração é realizada, o EF6 selecionará um banco de dados SQL Express ou LocalDb.If no configuration is performed, EF6 will select a database on SQL Express or LocalDb.

  • Se uma cadeia de caracteres de conexão com o mesmo nome que o contexto é em aplicativos de App/Web.config arquivo, essa conexão será usada.If a connection string with the same name as the context is in the applications App/Web.config file, this connection will be used.

  • Se o banco de dados não existir, ele é criado.If the database does not exist, it is created.

  • Se nenhuma das tabelas do modelo existir no banco de dados, o esquema para o modelo atual é adicionado ao banco de dados.If none of the tables from the model exist in the database, the schema for the current model is added to the database. Se as migrações são habilitadas, eles são usados para criar o banco de dados.If migrations are enabled, then they are used to create the database.

  • Se o banco de dados existe e EF6 tivesse criado anteriormente o esquema, o esquema é verificado para compatibilidade com o modelo atual.If the database exists and EF6 had previously created the schema, then the schema is checked for compatibility with the current model. Uma exceção é lançada se o modelo foi alterado desde que o esquema foi criado.An exception is thrown if the model has changed since the schema was created.

O EF Core não executa essa mágica.EF Core does not perform any of this magic.

  • A conexão de banco de dados deve ser configurado explicitamente no código.The database connection must be explicitly configured in code.

  • Nenhuma inicialização será executada.No initialization is performed. Você deve usar DbContext.Database.Migrate() para aplicar as migrações (ou DbContext.Database.EnsureCreated() e EnsureDeleted() para criar/excluir o banco de dados sem usar as migrações).You must use DbContext.Database.Migrate() to apply migrations (or DbContext.Database.EnsureCreated() and EnsureDeleted() to create/delete the database without using migrations).

Tabela do primeiro código convenção de nomenclaturaCode First table naming convention

EF6 é executado o nome de classe de entidade por meio de um serviço de pluralização para calcular o nome da tabela padrão que a entidade é mapeada para.EF6 runs the entity class name through a pluralization service to calculate the default table name that the entity is mapped to.

EF Core usa o nome da DbSet propriedade que a entidade é exposta no contexto derivado.EF Core uses the name of the DbSet property that the entity is exposed in on the derived context. Se a entidade não tiver um DbSet propriedade e, em seguida, o nome da classe é usada.If the entity does not have a DbSet property, then the class name is used.