Ingénierie à reboursReverse Engineering

L’ingénierie à rebours est le processus de génération de modèles automatique classes de type d’entité et une classe DbContext basée sur un schéma de base de données.Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. Elle peut être effectuée à l’aide de la Scaffold-DbContext commande des outils Entity Framework Core Package Manager Console (PMC) ou le dotnet ef dbcontext scaffold commande des outils d’Interface de ligne de commande (CLI) .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.

Installation deInstalling

Avant de l’ingénierie à rebours, vous devrez installer soit le outils PMC (Visual Studio uniquement) ou le outils CLI.Before reverse engineering, you'll need to install either the PMC tools (Visual Studio only) or the CLI tools. Consultez les liens pour plus d’informations.See links for details.

Vous devez également installer approprié fournisseur de base de données pour le schéma de base de données que vous voulez rétroconcevoir.You'll also need to install an appropriate database provider for the database schema you want to reverse engineer.

Chaîne de connexionConnection string

Le premier argument de la commande est une chaîne de connexion à la base de données.The first argument to the command is a connection string to the database. Les outils utilisera cette chaîne de connexion pour lire le schéma de base de données.The tools will use this connection string to read the database schema.

Comment mettre entre guillemets et séquence d’échappement de la chaîne de connexion dépend le shell vous utilisez pour exécuter la commande.How you quote and escape the connection string depends on which shell you are using to execute the command. Reportez-vous à la documentation de l’interpréteur de commandes pour plus de détails.Refer to your shell's documentation for specifics. Par exemple, PowerShell vous oblige à échapper le $ de caractères, mais pas \.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

Configuration et les Secrets de l’utilisateurConfiguration and User Secrets

Si vous avez un projet ASP.NET Core, vous pouvez utiliser le Name=<connection-string> syntaxe qui lit la chaîne de connexion de configuration.If you have an ASP.NET Core project, you can use the Name=<connection-string> syntax to read the connection string from configuration.

Cela fonctionne bien avec le outil Secret Manager de séparer votre mot de passe de base de données à partir de votre code base.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

Nom du fournisseurProvider name

Le deuxième argument est le nom du fournisseur.The second argument is the provider name. Le nom du fournisseur est généralement le même que le nom du fournisseur NuGet package.The provider name is typically the same as the provider's NuGet package name.

Spécification de tablesSpecifying tables

Toutes les tables dans le schéma de base de données sont intégrées dans les types d’entités par défaut.All tables in the database schema are reverse engineered into entity types by default. Vous pouvez limiter les tables sont inversées conçu en spécifiant des schémas et tables.You can limit which tables are reverse engineered by specifying schemas and tables.

Le -Schemas paramètre dans PMC et les --schema option dans l’interface CLI peut être utilisée pour inclure toutes les tables dans un schéma.The -Schemas parameter in PMC and the --schema option in the CLI can be used to include every table within a schema.

-Tables (PMC) et --table (CLI) peut être utilisé pour inclure des tables spécifiques.-Tables (PMC) and --table (CLI) can be used to include specific tables.

Pour inclure plusieurs tables dans PMC, utilisez un tableau.To include multiple tables in PMC, use an array.

Scaffold-DbContext ... -Tables Artist, Album

Pour inclure plusieurs tables dans l’interface CLI, spécifiez l’option plusieurs fois.To include multiple tables in the CLI, specify the option multiple times.

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

Conservation des nomsPreserving names

Noms de table et de colonne sont fixes pour mieux refléter les conventions de nommage .NET pour les types et les propriétés par défaut.Table and column names are fixed up to better match the .NET naming conventions for types and properties by default. En spécifiant le -UseDatabaseNames basculer dans PMC ou --use-database-names option dans l’interface CLI va désactiver ce comportement en conservant les noms de base de données d’origine autant que possible.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. Identificateurs de .NET non valides doit toujours être corrigés et synthétisées noms comme propriétés de navigation seront toujours conforme aux conventions d’affectation de noms .NET.Invalid .NET identifiers will still be fixed and synthesized names like navigation properties will still conform to .NET naming conventions.

API Fluent ou des Annotations de donnéesFluent API or Data Annotations

Types d’entité sont configurés à l’aide de l’API Fluent par défaut.Entity types are configured using the Fluent API by default. Spécifiez -DataAnnotations (PMC) ou --data-annotations (CLI) à utiliser à la place des annotations de données lorsque cela est possible.Specify -DataAnnotations (PMC) or --data-annotations (CLI) to instead use data annotations when possible.

Par exemple, à l’aide de l’API Fluent sera structurer this.For example, using the Fluent API will scaffold the this.

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

Lors de l’utilisation d’Annotations de données sera structurer cela.While using Data Annotations will scaffold this.

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

Nom de DbContextDbContext name

Le nom de la classe DbContext structuré sera le nom de la base de données avec le suffixe contexte par défaut.The scaffolded DbContext class name will be the name of the database suffixed with Context by default. Pour spécifier une autre, utilisez -Context dans PMC et --context dans l’interface CLI.To specify a different one, use -Context in PMC and --context in the CLI.

Espaces de noms et de répertoiresDirectories and namespaces

Les classes d’entité et une classe DbContext sont généré automatiquement dans le répertoire du projet racine et utilisent l’espace de noms par défaut du projet.The entity classes and a DbContext class are scaffolded into the project's root directory and use the project's default namespace. Vous pouvez spécifier le répertoire où les classes sont structurés à l’aide de -OutputDir (PMC) ou --output-dir (CLI).You can specify the directory where classes are scaffolded using -OutputDir (PMC) or --output-dir (CLI). L’espace de noms sera l’espace de noms racine ainsi que les noms de tous les sous-répertoires sous le répertoire du projet racine.The namespace will be the root namespace plus the names of any subdirectories under the project's root directory.

Vous pouvez également utiliser -ContextDir (PMC) et --context-dir (CLI) pour générer automatiquement la classe DbContext dans un répertoire séparé à partir des classes de type d’entité.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

Son fonctionnementHow it works

L’ingénierie à rebours démarre en lisant le schéma de base de données.Reverse engineering starts by reading the database schema. Il lit les informations sur les tables, colonnes, contraintes et index.It reads information about tables, columns, constraints, and indexes.

Ensuite, il utilise les informations de schéma pour créer un modèle EF Core.Next, it uses the schema information to create an EF Core model. Tables sont utilisées pour créer des types d’entité ; colonnes sont utilisées pour créer des propriétés ; et les clés étrangères sont utilisés pour créer des relations.Tables are used to create entity types; columns are used to create properties; and foreign keys are used to create relationships.

Enfin, le modèle est utilisé pour générer le code.Finally, the model is used to generate code. Correspondante entity type données de classes et API Fluent annotations sont structurées afin de recréer le même modèle à partir de votre application.The corresponding entity type classes, Fluent API, and data annotations are scaffolded in order to re-create the same model from your app.

Ce qui ne fonctionne pasWhat doesn't work

Pas toutes les informations sur un modèle peuvent être représentées à l’aide d’un schéma de base de données.Not everything about a model can be represented using a database schema. Par exemple, les informations sur hiérarchies d’héritage, types détenus, et fractionnement de table ne sont pas présents dans le schéma de base de données.For example, information about inheritance hierarchies, owned types, and table splitting are not present in the database schema. Pour cette raison, ces constructions seront jamais être l’ingénierie inverse.Because of this, these constructs will never be reverse engineered.

En outre, certains types de colonne ne peut pas être pris en charge par le fournisseur EF Core.In addition, some column types may not be supported by the EF Core provider. Ces colonnes ne seront pas incluses dans le modèle.These columns won't be included in the model.

EF Core requiert la clé de chaque type d’entité.EF Core requires every entity type to have a key. Toutefois, les tables, ne sont pas requis pour spécifier une clé primaire.Tables, however, aren't required to specify a primary key. Tables sans clé primaire sont actuellement pas l’ingénierie inverse.Tables without a primary key are currently not reverse engineered.

Vous pouvez définir jetons d’accès concurrentiel dans un modèle EF Core pour empêcher les deux utilisateurs de la mise à jour de la même entité en même temps.You can define concurrency tokens in an EF Core model to prevent two users from updating the same entity at the same time. Certaines bases de données ont un type spécial pour représenter ce type de colonne (par exemple, rowversion dans SQL Server) dans ce cas, nous pouvons inverser concevoir ces informations ; Toutefois, les autres jetons d’accès concurrentiel ne sera pas être l’ingénierie inverse.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.

Personnalisation du modèleCustomizing the model

Le code généré par EF Core est votre code.The code generated by EF Core is your code. N’hésitez pas à le modifier.Feel free to change it. Il sera regénéré uniquement si vous rétroconcevez le même modèle à nouveau.It will only be regenerated if you reverse engineer the same model again. Représente le code structuré un modèle qui peut être utilisé pour accéder à la base de données, mais il n’est certainement pas le uniquement modèle qui peut être utilisé.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.

Personnaliser les classes de type d’entité et de la classe DbContext pour répondre à vos besoins.Customize the entity type classes and DbContext class to fit your needs. Par exemple, vous pouvez choisir Renommer des types et des propriétés, introduire des hiérarchies d’héritage ou fractionner une table dans plusieurs entités.For example, you may choose to rename types and properties, introduce inheritance hierarchies, or split a table into to multiple entities. Vous pouvez également supprimer des index non uniques, séquences inutilisés propriétés de navigation, les propriétés scalaires facultatives et des noms de contraintes à partir du modèle.You can also remove non-unique indexes, unused sequences and navigation properties, optional scalar properties, and constraint names from the model.

Vous pouvez également ajouter d’autres constructeurs, méthodes, propriétés, etc.You can also add additional constructors, methods, properties, etc. à l’aide d’une autre classe partielle dans un fichier distinct.using another partial class in a separate file. Cette approche fonctionne même lorsque vous avez l’intention de rétroconcevoir le modèle à nouveau.This approach works even when you intend to reverse engineer the model again.

La mise à jour le modèleUpdating the model

Après avoir apporté des modifications à la base de données, vous devrez peut-être mettre à jour votre modèle EF Core pour refléter ces modifications.After making changes to the database, you may need to update your EF Core model to reflect those changes. Si les modifications de base de données sont simples, il peut être plus facile de simplement effectuer manuellement les modifications dans votre modèle EF Core.If the database changes are simple, it may be easiest just to manually make the changes to your EF Core model. Par exemple, renommer une table ou une colonne, suppression d’une colonne ou la mise à jour d’un type de colonne est des modifications simples à effectuer dans le code.For example, renaming a table or column, removing a column, or updating a column's type are trivial changes to make in code.

Changements plus importants, toutefois, ne sont pas en tant que marque facile manuellement.More significant changes, however, are not as easy make manually. Un flux de travail courant consiste à inverser concevoir le modèle à partir de la base de données à l’aide de -Force (PMC) ou --force (CLI) pour remplacer le modèle existant avec une mise à jour.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.

Une autre fonctionnalité souvent demandée est la possibilité de mettre à jour le modèle à partir de la base de données tout en conservant la personnalisation, telles que les changements de noms, les hiérarchies de types, etc. Utiliser le problème #831 pour suivre la progression de cette fonctionnalité.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.

Avertissement

Si vous effectuez la rétroconception du modèle à partir de la base de données à nouveau, toutes les modifications apportées aux fichiers seront perdues.If you reverse engineer the model from the database again, any changes you've made to the files will be lost.