Reverse-EngineeringReverse Engineering

Reverse Engineering ist der Prozess der Gerüstbau, Entity-Typ-Klassen und eine DbContext-Klasse, die basierend auf einem Datenbankschema.Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. Sie können mithilfe von ausgeführt werden die Scaffold-DbContext Befehl der Paket-Manager-Konsole (PMC) von EF Core-Tools oder dotnet ef dbcontext scaffold -Befehl von .NET Command-Line Interface (CLI)-Tools.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.

InstallationInstalling

Vor reverse Engineering, müssen Sie zum Installieren der PMC-Tools (nur Visual Studio) oder die CLI-Tools.Before reverse engineering, you'll need to install either the PMC tools (Visual Studio only) or the CLI tools. Finden Sie Links Weitere Informationen.See links for details.

Sie müssen auch eine entsprechende installieren Datenbankanbieter für das Datenbankschema für das reverse Engineering werden sollen.You'll also need to install an appropriate database provider for the database schema you want to reverse engineer.

VerbindungszeichenfolgeConnection string

Das erste Argument für den Befehl wird eine Verbindungszeichenfolge für die Datenbank.The first argument to the command is a connection string to the database. Die Tools werden diese Verbindungszeichenfolge verwenden, um das Datenbankschema zu lesen.The tools will use this connection string to read the database schema.

Wie Sie zitieren und Escapezeichen die Verbindungszeichenfolge hängt ab, in der Shell Sie zum Ausführen des Befehls verwenden.How you quote and escape the connection string depends on which shell you are using to execute the command. Finden Sie Einzelheiten in Ihrer Shell.Refer to your shell's documentation for specifics. Z. B. PowerShell müssen Sie mit Escapezeichen versehen die $ Zeichen, aber nicht \.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

Konfiguration und vertrauliche Informationen eines BenutzersConfiguration and User Secrets

Wenn Sie eine ASP.NET Core-Projekt verfügen, können Sie die Name=<connection-string> Syntax, um die Verbindungszeichenfolge aus der Konfiguration gelesen.If you have an ASP.NET Core project, you can use the Name=<connection-string> syntax to read the connection string from configuration.

Dies funktioniert gut mit den Secret Manager-Tool um Ihr Datenbankkennwort von Ihrer Codebasis zu trennen.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

Name des AnbietersProvider name

Das zweite Argument ist der Name des Anbieters.The second argument is the provider name. Der Name des Anbieters entspricht in der Regel der Name des Anbieters NuGet-Paket.The provider name is typically the same as the provider's NuGet package name.

Festlegen von TabellenSpecifying tables

Alle Tabellen im Datenbankschema sind reverse Engineering in Entitätstypen in der Standardeinstellung.All tables in the database schema are reverse engineered into entity types by default. Sie können einschränken, welche Tabellen reverse sind so konzipiert, indem Sie Schemas und Tabellen angeben.You can limit which tables are reverse engineered by specifying schemas and tables.

Die -Schemas Parameter in PMC und --schema Option in der CLI kann verwendet werden, um jede Tabelle in einem Schema enthalten.The -Schemas parameter in PMC and the --schema option in the CLI can be used to include every table within a schema.

-Tables (PMC) und --table (CLI) kann verwendet werden, können Sie bestimmte Tabellen einbeziehen.-Tables (PMC) and --table (CLI) can be used to include specific tables.

Um mehrere Tabellen in der PMC einzuschließen, verwenden Sie ein Array.To include multiple tables in PMC, use an array.

Scaffold-DbContext ... -Tables Artist, Album

Um mehrere Tabellen in der CLI einzuschließen, geben Sie die Option mehrfach.To include multiple tables in the CLI, specify the option multiple times.

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

Beibehalten von NamenPreserving names

Tabellen- und Spaltennamen werden repariert, die .NET-Benennungskonventionen für Typen und Eigenschaften besser zu entsprechen standardmäßig.Table and column names are fixed up to better match the .NET naming conventions for types and properties by default. Angeben der -UseDatabaseNames in PMC wechseln oder die --use-database-names Option in der CLI wird dieses Verhalten, das die ursprünglichen Datenbanknamen so weit wie möglich beibehalten deaktiviert.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. Ungültige .NET Bezeichner werden immer noch behoben werden, und synthetische Namen wie z. B. Navigationseigenschaften werden weiterhin Namenskonventionen von .NET entsprechen.Invalid .NET identifiers will still be fixed and synthesized names like navigation properties will still conform to .NET naming conventions.

Fluent-API oder DatenanmerkungenFluent API or Data Annotations

Entitätstypen mithilfe der Fluent-API wird standardmäßig konfiguriert.Entity types are configured using the Fluent API by default. Geben Sie -DataAnnotations (PMC) oder --data-annotations (CLI) zu verwenden. von datenanmerkungen, sofern möglich.Specify -DataAnnotations (PMC) or --data-annotations (CLI) to instead use data annotations when possible.

Beispielsweise wird mit der Fluent-API diese Gerüst:For example, using the Fluent API will scaffold this:

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

Dies wird bei der Verwendung von Datenanmerkungen Gerüst:While using Data Annotations will scaffold this:

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

"DbContext"-nameDbContext name

Die erstellte "DbContext"-Klasse wird als Name der Name der Datenbank mit dem Suffix Kontext standardmäßig.The scaffolded DbContext class name will be the name of the database suffixed with Context by default. Um einen anderen Wert anzugeben, verwenden -Context in PMC und --context in der CLI.To specify a different one, use -Context in PMC and --context in the CLI.

Verzeichnisse und namespacesDirectories and namespaces

Die Entitätsklassen und eine DbContext-Klasse sind, die in das Stammverzeichnis des Projekts erstellt haben, und Verwenden von Standardnamespace des Projekts aus.The entity classes and a DbContext class are scaffolded into the project's root directory and use the project's default namespace. Sie können das Verzeichnis angeben, das Gerüst für Klassen erstellt werden, mithilfe von -OutputDir (PMC) oder --output-dir (CLI).You can specify the directory where classes are scaffolded using -OutputDir (PMC) or --output-dir (CLI). Der Namespace werden den Stamm-Namespace sowie die Namen der keine Unterverzeichnisse unter dem Stammverzeichnis des Projekts.The namespace will be the root namespace plus the names of any subdirectories under the project's root directory.

Sie können auch -ContextDir (PMC) und --context-dir (CLI) zum Erstellen des Gerüsts für der DbContext-Klasse in einem separaten Verzeichnis über die entitätstypklassen.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

So funktioniert esHow it works

Reverse Engineering beginnt mit der das Schema der Datenbank lesen.Reverse engineering starts by reading the database schema. Sie liest die Informationen zu Tabellen, Spalten, Einschränkungen und Indizes.It reads information about tables, columns, constraints, and indexes.

Als Nächstes verwendet er die Schemainformationen zum Erstellen eines EF Core-Modells.Next, it uses the schema information to create an EF Core model. Tabellen werden verwendet, um Entitätstypen zu erstellen. Spalten werden verwendet, um Eigenschaften zu erstellen. und Fremdschlüssel werden verwendet, um Beziehungen zu erstellen.Tables are used to create entity types; columns are used to create properties; and foreign keys are used to create relationships.

Schließlich wird das Modell verwendet, um Code zu generieren.Finally, the model is used to generate code. Die entsprechenden Entität Klassen, Fluent-API und Daten typanmerkungen sind erstellt haben, um das gleiche Modell aus Ihrer app neu zu erstellen.The corresponding entity type classes, Fluent API, and data annotations are scaffolded in order to re-create the same model from your app.

Was nicht funktioniertWhat doesn't work

Nicht alles, was zu einem Modell kann mit einem Datenbankschema dargestellt werden.Not everything about a model can be represented using a database schema. Z. B. Informationen zu Vererbungshierarchien, eigene Typen, und Tabelle aufteilen nicht in das Schema der Datenbank vorhanden sind.For example, information about inheritance hierarchies, owned types, and table splitting are not present in the database schema. Aus diesem Grund wird diese Konstrukte nie zurückentwickelt werden.Because of this, these constructs will never be reverse engineered.

Darüber hinaus Einige Spaltentypen möglicherweise nicht vom Entity Framework Core-Anbieter unterstützt werden.In addition, some column types may not be supported by the EF Core provider. Diese Spalten nicht im Modell berücksichtigt.These columns won't be included in the model.

EF Core erfordert jeder Entitätstyp, der einen Schlüssel verfügen.EF Core requires every entity type to have a key. Tabellen werden nicht allerdings erforderlich, um einen primären Schlüssel anzugeben.Tables, however, aren't required to specify a primary key. Tabellen ohne Primärschlüssel sind derzeit nicht mit Reverse Engineering.Tables without a primary key are currently not reverse engineered.

Sie können definieren, parallelitätstoken in ein EF Core-Modell, um zu verhindern, dass zwei Benutzer die gleiche Entität zur selben Zeit aktualisiert.You can define concurrency tokens in an EF Core model to prevent two users from updating the same entity at the same time. Einige Datenbanken haben eine besondere Art dieser Art von Spalte (z. B. "Rowversion" in SQL Server) darstellen, in diesem Fall kehren wir können diese Informationen zu entwickeln. Allerdings wird andere parallelitätstoken nicht zurückentwickelt werden.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.

Anpassen des ModellsCustomizing the model

Der von EF Core generierte Code ist der Code.The code generated by EF Core is your code. Sie ändern können.Feel free to change it. Es wird nur neu generiert werden, wenn Sie Engineering desselben Modells erneut Reverse.It will only be regenerated if you reverse engineer the same model again. Der eingerüstete Code stellt eine Modell, das verwendet werden kann, auf die Datenbank, aber es ist sicherlich nicht der nur Modell, das verwendet werden kann.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.

Passen Sie die entitätstypklassen und DbContext-Klasse, die Ihren Bedürfnissen an.Customize the entity type classes and DbContext class to fit your needs. Sie könnten z. B. das Umbenennen von Typen und Eigenschaften, Vererbungshierarchien einführen oder Teilen einer Tabelle in mehreren Entitäten.For example, you may choose to rename types and properties, introduce inheritance hierarchies, or split a table into to multiple entities. Sie können auch nicht eindeutige Indizes, nicht verwendete Sequenzen und Navigationseigenschaften, optionale skalare Eigenschaften und Einschränkungsnamen, die aus dem Modell entfernen.You can also remove non-unique indexes, unused sequences and navigation properties, optional scalar properties, and constraint names from the model.

Sie können auch zusätzliche Konstruktoren, Methoden, Eigenschaften usw., hinzufügen.You can also add additional constructors, methods, properties, etc. verwenden eine andere partielle Klasse in einer separaten Datei an.using another partial class in a separate file. Dieser Ansatz funktioniert auch, wenn Sie beabsichtigen, reverse-Engineering-das Modell erneut aus.This approach works even when you intend to reverse engineer the model again.

Aktualisieren des ModellsUpdating the model

Nach dem vornehmen von Änderungen in der Datenbank, müssen Sie das EF Core-Modell entsprechend aktualisieren.After making changes to the database, you may need to update your EF Core model to reflect those changes. Wenn die Änderungen in der Datenbank auf einfach festgelegt sind, kann es am einfachsten, nur um die Änderungen an Ihrem EF Core-Modell manuell zu vornehmen sein.If the database changes are simple, it may be easiest just to manually make the changes to your EF Core model. Beispielsweise werden durch das Umbenennen einer Tabelle oder Spalte, eine Spalte zu entfernen oder Aktualisieren einer Spalte des Typs banale Änderungen im Code vornehmen.For example, renaming a table or column, removing a column, or updating a column's type are trivial changes to make in code.

Bei wichtigeren Änderungen sind jedoch nicht einfach stellen manuell.More significant changes, however, are not as easy make manually. Ein gängiger Workflow ist Reverse Engineering für das Modell aus der Datenbank erneut mit -Force (PMC) oder --force (CLI), um das vorhandene Modell durch eine aktualisierte zu überschreiben.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.

Ein weiteres häufig angeforderte Feature ist die Möglichkeit, das Modell aus der Datenbank zu aktualisieren, Beibehaltung von Anpassungen wie umbenennungen, Typhierarchien usw. an. Verwenden von Problem #831 zum Nachverfolgen des Status der dieses Feature.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.

Warnung

Wenn reverse das Modell aus der Datenbank erneut Engineering verloren zu den Dateien vorgenommenen Änderungen.If you reverse engineer the model from the database again, any changes you've made to the files will be lost.