Engenharia reversaReverse Engineering

Engenharia reversa é o processo de scaffolding de classes de tipo de entidade e uma classe DbContext com base em um esquema de banco de dados.Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. Ele pode ser realizado usando o Scaffold-DbContext comando das ferramentas do EF Core pacote Manager Console (PMC) ou o dotnet ef dbcontext scaffold comando das ferramentas de Interface de linha de comando (CLI) do .NET.It can be performed using the Scaffold-DbContext command of the EF Core Package Manager Console (PMC) tools or the dotnet ef dbcontext scaffold command of the .NET Command-line Interface (CLI) tools.

Instalando oInstalling

Antes de engenharia reversa, você precisará instalar o ferramentas PMC (somente Visual Studio) ou o ferramentas da CLI.Before reverse engineering, you'll need to install either the PMC tools (Visual Studio only) or the CLI tools. Consulte os links para obter detalhes.See links for details.

Você também precisará instalar um apropriado provedor de banco de dados para o esquema de banco de dados que você deseja fazer engenharia reversa.You'll also need to install an appropriate database provider for the database schema you want to reverse engineer.

Cadeia de caracteres de ConexãoConnection string

O primeiro argumento para o comando é uma cadeia de caracteres de conexão ao banco de dados.The first argument to the command is a connection string to the database. As ferramentas usará essa cadeia de caracteres de conexão para ler o esquema de banco de dados.The tools will use this connection string to read the database schema.

Como você pode colocar entre aspas e escapar a cadeia de caracteres de conexão depende do shell do qual você está usando para executar o comando.How you quote and escape the connection string depends on which shell you are using to execute the command. Consulte a documentação do seu shell para obter informações específicas.Refer to your shell's documentation for specifics. Por exemplo, o PowerShell requer escapar o $ de caractere, mas não \.For example, PowerShell requires you to escape the $ character, but not \.

Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer
dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

Configuração e os segredos do usuárioConfiguration and User Secrets

Se você tiver um projeto ASP.NET Core, você pode usar o Name=<connection-string> sintaxe para ler a cadeia de caracteres de conexão de configuração.If you have an ASP.NET Core project, you can use the Name=<connection-string> syntax to read the connection string from configuration.

Isso funciona bem com o ferramenta Secret Manager para manter sua senha do banco de dados separado de sua base de código.This works well with the Secret Manager tool to keep your database password separate from your codebase.

dotnet user-secrets set ConnectionStrings.Chinook "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook"
dotnet ef dbcontext scaffold Name=Chinook Microsoft.EntityFrameworkCore.SqlServer

Nome do provedorProvider name

O segundo argumento é o nome do provedor.The second argument is the provider name. O nome do provedor normalmente é o mesmo nome do pacote NuGet do provedor.The provider name is typically the same as the provider's NuGet package name.

Especificação de tabelasSpecifying tables

Todas as tabelas no esquema de banco de dados engenharia reversos eles em tipos de entidade por padrão.All tables in the database schema are reverse engineered into entity types by default. Você pode limitar quais tabelas engenharia reversos, eles especificando os esquemas e tabelas.You can limit which tables are reverse engineered by specifying schemas and tables.

O -Schemas parâmetro no PMC e o --schema opção na CLI pode ser usada para incluir todas as tabelas em um esquema.The -Schemas parameter in PMC and the --schema option in the CLI can be used to include every table within a schema.

-Tables (PMC) e --table (CLI) pode ser usada para incluir tabelas específicas.-Tables (PMC) and --table (CLI) can be used to include specific tables.

Para incluir várias tabelas no PMC, use uma matriz.To include multiple tables in PMC, use an array.

Scaffold-DbContext ... -Tables Artist, Album

Para incluir várias tabelas na CLI, especifique a opção várias vezes.To include multiple tables in the CLI, specify the option multiple times.

dotnet ef dbcontext scaffold ... --table Artist --table Album

Preserva nomesPreserving names

Nomes de tabela e coluna são corrigidos para que corresponda melhor às convenções de nomenclatura .NET para tipos e propriedades por padrão.Table and column names are fixed up to better match the .NET naming conventions for types and properties by default. Especificando o -UseDatabaseNames PMC de inserção ou a --use-database-names opção na CLI desabilitará esse comportamento preserva os nomes de banco de dados original tanto quanto possível.Specifying the -UseDatabaseNames switch in PMC or the --use-database-names option in the CLI will disable this behavior preserving the original database names as much as possible. Identificadores inválidos de .NET ainda serão corrigidos e sintetizados nomes como propriedades de navegação ainda estará em conformidade com as convenções de nomenclatura do .NET.Invalid .NET identifiers will still be fixed and synthesized names like navigation properties will still conform to .NET naming conventions.

API Fluent ou anotações de dadosFluent API or Data Annotations

Tipos de entidade são configurados usando a API Fluent por padrão.Entity types are configured using the Fluent API by default. Especificar -DataAnnotations (PMC) ou --data-annotations (CLI) em vez disso, usar anotações de dados sempre que possível.Specify -DataAnnotations (PMC) or --data-annotations (CLI) to instead use data annotations when possible.

Por exemplo, usando a API Fluent irá dar suporte a isso.For example, using the Fluent API will scaffold the this.

entity.Property(e => e.Title)
    .IsRequired()
    .HasMaxLength(160);

Ao usar anotações de dados irá dar suporte isso.While using Data Annotations will scaffold this.

[Required]
[StringLength(160)]
public string Title { get; set; }

Nome de DbContextDbContext name

O nome da classe DbContext gerado por scaffolding será o nome do banco de dados com o sufixo contexto por padrão.The scaffolded DbContext class name will be the name of the database suffixed with Context by default. Para especificar o outra, use -Context no PMC e --context na CLI.To specify a different one, use -Context in PMC and --context in the CLI.

Diretórios e namespacesDirectories and namespaces

As classes de entidade e uma classe DbContext são gerados automaticamente no diretório raiz do projeto e usam o namespace do projeto padrão.The entity classes and a DbContext class are scaffolded into the project's root directory and use the project's default namespace. Você pode especificar o diretório em que as classes são gerados automaticamente usando -OutputDir (PMC) ou --output-dir (CLI).You can specify the directory where classes are scaffolded using -OutputDir (PMC) or --output-dir (CLI). O namespace será o namespace raiz além dos nomes de todos os subdiretórios no diretório raiz do projeto.The namespace will be the root namespace plus the names of any subdirectories under the project's root directory.

Você também pode usar -ContextDir (PMC) e --context-dir (CLI) para gerar automaticamente a classe DbContext em um diretório separado das classes de tipo de entidade.You can also use -ContextDir (PMC) and --context-dir (CLI) to scaffold the DbContext class into a separate directory from the entity type classes.

Scaffold-DbContext ... -ContextDir Data -OutputDir Models
dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

Como ele funcionaHow it works

Engenharia reversa começa lendo o esquema de banco de dados.Reverse engineering starts by reading the database schema. Ele lê as informações sobre tabelas, colunas, restrições e índices.It reads information about tables, columns, constraints, and indexes.

Em seguida, ele usa as informações de esquema para criar um modelo do EF Core.Next, it uses the schema information to create an EF Core model. Tabelas são usadas para criar tipos de entidade; colunas são usadas para criar propriedades; e chaves estrangeiras são usadas para criar relações.Tables are used to create entity types; columns are used to create properties; and foreign keys are used to create relationships.

Por fim, o modelo é usado para gerar código.Finally, the model is used to generate code. Os correspondente entidade classes, a API Fluent e dados anotações de tipo são gerados automaticamente para recriar o mesmo modelo de seu aplicativo.The corresponding entity type classes, Fluent API, and data annotations are scaffolded in order to re-create the same model from your app.

O que não funcionaWhat doesn't work

Nem tudo sobre um modelo pode ser representado usando um esquema de banco de dados.Not everything about a model can be represented using a database schema. Por exemplo, informações sobre hierarquias de herança, tipos próprios, e divisão de tabela não estão presentes no esquema de banco de dados.For example, information about inheritance hierarchies, owned types, and table splitting are not present in the database schema. Por isso, essas construções serão nunca ser revertida.Because of this, these constructs will never be reverse engineered.

Além disso, alguns tipos de coluna podem não ter suporte pelo provedor do EF Core.In addition, some column types may not be supported by the EF Core provider. Essas colunas não incluídas no modelo.These columns won't be included in the model.

O EF Core exige que cada tipo de entidade ter uma chave.EF Core requires every entity type to have a key. Tabelas, no entanto, não é necessário especificar uma chave primária.Tables, however, aren't required to specify a primary key. Tabelas sem uma chave primária estão no momento, não com engenharia reversa.Tables without a primary key are currently not reverse engineered.

Você pode definir tokens de simultaneidade em um modelo do EF Core para impedir que os dois usuários atualizando a mesma entidade ao mesmo tempo.You can define concurrency tokens in an EF Core model to prevent two users from updating the same entity at the same time. Alguns bancos de dados têm um tipo especial para representar este tipo de coluna (por exemplo, rowversion no SQL Server) no caso, é possível reverter a engenharia essas informações; No entanto, outros tokens de simultaneidade será não ser a engenharia reversa.Some databases have a special type to represent this type of column (for example, rowversion in SQL Server) in which case we can reverse engineer this information; however, other concurrency tokens will not be reverse engineered.

Personalizando o modeloCustomizing the model

O código gerado pelo EF Core é seu código.The code generated by EF Core is your code. Fique à vontade para alterá-lo.Feel free to change it. Ele só será registrado se você fazer engenharia reversa do mesmo modelo novamente.It will only be regenerated if you reverse engineer the same model again. Representa o código gerado por scaffolding uma modelo que pode ser usado para acessar o banco de dados, mas certamente não é o somente modelo que pode ser usado.The scaffolded code represents one model that can be used to access the database, but it's certainly not the only model that can be used.

Personalize as classes de tipo de entidade e classe DbContext para atender às suas necessidades.Customize the entity type classes and DbContext class to fit your needs. Por exemplo, você pode optar por renomear tipos e propriedades, introduzir a hierarquias de herança ou dividir uma tabela em várias entidades.For example, you may choose to rename types and properties, introduce inheritance hierarchies, or split a table into to multiple entities. Você também pode remover os índices não exclusivos, sequências não utilizadas e propriedades de navegação, opcionais propriedades escalares e nomes de restrição do modelo.You can also remove non-unique indexes, unused sequences and navigation properties, optional scalar properties, and constraint names from the model.

Você também pode adicionar mais construtores, métodos, propriedades, etc.You can also add additional constructors, methods, properties, etc. usando outra classe parcial em um arquivo separado.using another partial class in a separate file. Essa abordagem funciona mesmo quando você pretende fazer engenharia reversa o modelo novamente.This approach works even when you intend to reverse engineer the model again.

Atualizando o modeloUpdating the model

Depois de fazer alterações no banco de dados, você precisa atualizar o modelo do EF Core para refletir essas alterações.After making changes to the database, you may need to update your EF Core model to reflect those changes. Se as alterações de banco de dados são simples, pode ser mais fácil alterar manualmente o modelo do EF Core.If the database changes are simple, it may be easiest just to manually make the changes to your EF Core model. Por exemplo, renomear uma tabela ou coluna, remoção de uma coluna ou atualizando o tipo da coluna é triviais alterações a serem feitas no código.For example, renaming a table or column, removing a column, or updating a column's type are trivial changes to make in code.

Alterações mais significativas, no entanto, não são como tornar fácil manualmente.More significant changes, however, are not as easy make manually. O modelo do banco de dados novamente usando um fluxo de trabalho comum é reverter a engenharia -Force (PMC) ou --force (CLI) para substituir o modelo existente com um atualizado.One common workflow is to reverse engineer the model from the database again using -Force (PMC) or --force (CLI) to overwrite the existing model with an updated one.

Outro recurso normalmente solicitados é a capacidade de atualizar o modelo do banco de dados, preservando a personalização como renomeações, hierarquias de tipo, etc. Use o problema #831 para acompanhar o progresso desse recurso.Another commonly requested feature is the ability to update the model from the database while preserving customization like renames, type hierarchies, etc. Use issue #831 to track the progress of this feature.

Aviso

Se a engenharia reversa de modelo do banco de dados novamente, quaisquer alterações feitas aos arquivos serão perdidas.If you reverse engineer the model from the database again, any changes you've made to the files will be lost.