Reverse EngineeringReverse Engineering

Il Reverse Engineering è il processo di impalcature di classi di tipi di entità e una classe DbContext basata su uno schema di database.Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. Può essere eseguita usando il comando Scaffold-DbContext degli strumenti di EF Core Console di gestione pacchetti (PMC) o il comando dotnet ef dbcontext scaffold degli strumenti dell'interfaccia della riga di comando di .NET (CLI).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.

InstallazioneInstalling

Prima di reverse engineering, è necessario installare gli strumenti di PMC (solo Visual Studio) o gli strumenti dell'interfacciadella riga di comando.Before reverse engineering, you'll need to install either the PMC tools (Visual Studio only) or the CLI tools. Per informazioni dettagliate, vedere i collegamenti.See links for details.

Sarà inoltre necessario installare un provider di database appropriato per lo schema del database che si desidera decodificare.You'll also need to install an appropriate database provider for the database schema you want to reverse engineer.

Stringa di connessioneConnection string

Il primo argomento del comando è una stringa di connessione al database.The first argument to the command is a connection string to the database. Questa stringa di connessione verrà utilizzata dagli strumenti per leggere lo schema del database.The tools will use this connection string to read the database schema.

La modalità di citazione e di escape della stringa di connessione dipende dalla shell utilizzata per eseguire il comando.How you quote and escape the connection string depends on which shell you are using to execute the command. Per informazioni dettagliate, vedere la documentazione della shell.Refer to your shell's documentation for specifics. PowerShell, ad esempio, richiede l'escape del carattere di $, ma non \.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

Configurazione e segreti utenteConfiguration and User Secrets

Se si dispone di un progetto di ASP.NET Core, è possibile utilizzare la sintassi Name=<connection-string> per leggere la stringa di connessione dalla configurazione.If you have an ASP.NET Core project, you can use the Name=<connection-string> syntax to read the connection string from configuration.

Questo funziona bene con lo strumento di gestione dei segreti per evitare che la password del database sia separata dalla codebase.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 providerProvider name

Il secondo argomento è il nome del provider.The second argument is the provider name. Il nome del provider è in genere uguale al nome del pacchetto NuGet del provider.The provider name is typically the same as the provider's NuGet package name.

Specifica di tabelleSpecifying tables

Per impostazione predefinita, tutte le tabelle nello schema del database sono decodificate in tipi di entità.All tables in the database schema are reverse engineered into entity types by default. È possibile limitare le tabelle decodificate specificando schemi e tabelle.You can limit which tables are reverse engineered by specifying schemas and tables.

Il parametro -Schemas in PMC e l'opzione --schema nell'interfaccia della riga di comando possono essere utilizzati per includere ogni tabella all'interno di uno schema.The -Schemas parameter in PMC and the --schema option in the CLI can be used to include every table within a schema.

è possibile usare -Tables (PMC) e --table (CLI) per includere tabelle specifiche.-Tables (PMC) and --table (CLI) can be used to include specific tables.

Per includere più tabelle in PMC, usare una matrice.To include multiple tables in PMC, use an array.

Scaffold-DbContext ... -Tables Artist, Album

Per includere più tabelle nell'interfaccia della riga di comando, specificare l'opzione più volte.To include multiple tables in the CLI, specify the option multiple times.

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

Conservazione dei nomiPreserving names

Per impostazione predefinita, i nomi delle tabelle e delle colonne sono corretti per una migliore corrispondenza con le convenzioni di denominazione .NET per i tipi e le proprietà.Table and column names are fixed up to better match the .NET naming conventions for types and properties by default. Se si specifica l'opzione -UseDatabaseNames nell'interfaccia della riga di comando o l'opzione --use-database-names nell'interfaccia della riga di comando, questo comportamento verrà disabilitato nel modo più possibile mantenendo i nomi del database originale.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. Gli identificatori .NET non validi verranno comunque corretti e i nomi sintetizzati, come le proprietà di navigazione, saranno comunque conformi alle convenzioni di denominazione .NET.Invalid .NET identifiers will still be fixed and synthesized names like navigation properties will still conform to .NET naming conventions.

API Fluent o annotazioni dei datiFluent API or Data Annotations

Per impostazione predefinita, i tipi di entità vengono configurati tramite l'API Fluent.Entity types are configured using the Fluent API by default. Specificare -DataAnnotations (PMC) o --data-annotations (CLI) per usare invece le annotazioni dei dati, quando possibile.Specify -DataAnnotations (PMC) or --data-annotations (CLI) to instead use data annotations when possible.

Se ad esempio si usa l'API Fluent, l'impalcatura è la seguente:For example, using the Fluent API will scaffold this:

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

Quando si usano le annotazioni dei dati, questo è l'impalcatura:While using Data Annotations will scaffold this:

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

Nome DbContextDbContext name

Il nome della classe DbContext con impalcature sarà il nome del database con suffisso per impostazione predefinita .The scaffolded DbContext class name will be the name of the database suffixed with Context by default. Per specificare un valore diverso, usare -Context in PMC e --context nell'interfaccia della riga di comando.To specify a different one, use -Context in PMC and --context in the CLI.

Directory e spazi dei nomiDirectories and namespaces

Le classi di entità e una classe DbContext sono impalcature nella directory radice del progetto e usano lo spazio dei nomi predefinito del progetto.The entity classes and a DbContext class are scaffolded into the project's root directory and use the project's default namespace. È possibile specificare la directory in cui le classi sono sottoposto a impalcatura usando -OutputDir (PMC) o --output-dir (CLI).You can specify the directory where classes are scaffolded using -OutputDir (PMC) or --output-dir (CLI). Lo spazio dei nomi sarà lo spazio dei nomi radice più i nomi delle sottodirectory nella directory radice del progetto.The namespace will be the root namespace plus the names of any subdirectories under the project's root directory.

È anche possibile usare -ContextDir (PMC) e --context-dir (CLI) per eseguire il patibolo della classe DbContext in una directory separata dalle classi del tipo di 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

FunzionamentoHow it works

Il reverse engineering inizia con la lettura dello schema del database.Reverse engineering starts by reading the database schema. Legge le informazioni su tabelle, colonne, vincoli e indici.It reads information about tables, columns, constraints, and indexes.

USA quindi le informazioni sullo schema per creare un modello di EF Core.Next, it uses the schema information to create an EF Core model. Le tabelle vengono utilizzate per creare i tipi di entità. le colonne vengono utilizzate per creare le proprietà; e le chiavi esterne vengono utilizzate per creare relazioni.Tables are used to create entity types; columns are used to create properties; and foreign keys are used to create relationships.

Infine, il modello viene utilizzato per generare il codice.Finally, the model is used to generate code. Le classi del tipo di entità, l'API Fluent e le annotazioni dei dati corrispondenti sono basate su impalcature per ricreare lo stesso modello dall'app.The corresponding entity type classes, Fluent API, and data annotations are scaffolded in order to re-create the same model from your app.

LimitazioniLimitations

  • Non tutti gli elementi di un modello possono essere rappresentati utilizzando uno schema di database.Not everything about a model can be represented using a database schema. Ad esempio, le informazioni sulle gerarchie di ereditarietà, i tipi di proprietàe la suddivisione delle tabelle non sono presenti nello schema del database.For example, information about inheritance hierarchies, owned types, and table splitting are not present in the database schema. Per questo motivo, questi costrutti non verranno mai decodificati.Because of this, these constructs will never be reverse engineered.
  • Inoltre, alcuni tipi di colonna potrebbero non essere supportati dal provider EF core.In addition, some column types may not be supported by the EF Core provider. Queste colonne non verranno incluse nel modello.These columns won't be included in the model.
  • È possibile definire i token di concorrenzain un modello di EF core per impedire a due utenti di aggiornare la stessa entità nello stesso momento.You can define concurrency tokens, in an EF Core model to prevent two users from updating the same entity at the same time. Alcuni database hanno un tipo speciale per rappresentare questo tipo di colonna (ad esempio, rowversion in SQL Server), nel qual caso è possibile decompilare queste informazioni; Tuttavia, altri token di concorrenza non verranno decodificati.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.
  • La C# funzionalità a 8 tipi di riferimento Nullable non è attualmente supportata in Reverse Engineering: EF core genera C# sempre il codice che presuppone che la funzionalità sia disabilitata.The C# 8 nullable reference type feature is currently unsupported in reverse engineering: EF Core always generates C# code that assumes the feature is disabled. Ad esempio, le colonne di testo Nullable verranno sottoposto a impalcatura come proprietà con tipo string, non string?, con l'API Fluent o le annotazioni dei dati utilizzate per configurare se una proprietà è obbligatoria o meno.For example, nullable text columns will be scaffolded as a property with type string , not string?, with either the Fluent API or Data Annotations used to configure whether a property is required or not. È possibile modificare il codice con impalcature e sostituirle C# con annotazioni di valori null.You can edit the scaffolded code and replace these with C# nullability annotations. Il supporto dell'impalcatura per i tipi di riferimento nullable viene rilevato da Issue #15520.Scaffolding support for nullable reference types is tracked by issue #15520.

Personalizzazione del modelloCustomizing the model

Il codice generato da EF Core è il codice.The code generated by EF Core is your code. È possibile modificarlo.Feel free to change it. Verrà rigenerato solo se si esegue nuovamente la decompilazione dello stesso modello.It will only be regenerated if you reverse engineer the same model again. Il codice con impalcatura rappresenta un modello che può essere utilizzato per accedere al database, ma non è certo l' unico modello che può essere utilizzato.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.

Personalizzare le classi del tipo di entità e la classe DbContext in base alle esigenze.Customize the entity type classes and DbContext class to fit your needs. È ad esempio possibile scegliere di rinominare tipi e proprietà, introdurre gerarchie di ereditarietà o suddividere una tabella in più entità.For example, you may choose to rename types and properties, introduce inheritance hierarchies, or split a table into to multiple entities. È inoltre possibile rimuovere indici non univoci, sequenze inutilizzate e proprietà di navigazione, proprietà scalari facoltative e nomi di vincoli dal modello.You can also remove non-unique indexes, unused sequences and navigation properties, optional scalar properties, and constraint names from the model.

È anche possibile aggiungere ulteriori costruttori, metodi, proprietà e così via.You can also add additional constructors, methods, properties, etc. uso di un'altra classe parziale in un file separato.using another partial class in a separate file. Questo approccio funziona anche quando si intende decodificare nuovamente il modello.This approach works even when you intend to reverse engineer the model again.

Aggiornamento del modelloUpdating the model

Dopo aver apportato modifiche al database, potrebbe essere necessario aggiornare il modello di EF Core per riflettere tali modifiche.After making changes to the database, you may need to update your EF Core model to reflect those changes. Se le modifiche apportate al database sono semplici, potrebbe essere più semplice apportare manualmente le modifiche al modello di EF Core.If the database changes are simple, it may be easiest just to manually make the changes to your EF Core model. Ad esempio, la ridenominazione di una tabella o di una colonna, la rimozione di una colonna o l'aggiornamento del tipo di una colonna sono semplici modifiche da apportare nel codice.For example, renaming a table or column, removing a column, or updating a column's type are trivial changes to make in code.

Le modifiche più significative, tuttavia, non sono semplici da creare manualmente.More significant changes, however, are not as easy make manually. Un flusso di lavoro comune è quello di decompilare nuovamente il modello dal database usando -Force (PMC) o --force (CLI) per sovrascrivere il modello esistente con uno aggiornato.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.

Un'altra funzionalità comunemente richiesta è la possibilità di aggiornare il modello dal database mantenendo la personalizzazione, ad esempio le rinominazioni, le gerarchie dei tipi e così via. Utilizzare Issue #831 per tenere traccia dello stato di avanzamento di questa funzionalità.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.

Avviso

Se si esegue di nuovo la decompilazione del modello dal database, tutte le modifiche apportate ai file andranno perse.If you reverse engineer the model from the database again, any changes you've made to the files will be lost.