OdtwarzanieReverse Engineering

Odtwarzanie jest procesem tworzenia szkieletu klas typu jednostki i klasy DbContext na podstawie schematu bazy danych.Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. Można to zrobić za pomocą Scaffold-DbContext polecenia narzędzi EF Core Console Menedżera pakietów (PMC) lub dotnet ef dbcontext scaffold polecenia narzędzi interfejsu wiersza polecenia (CLI) platformy .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.

InstalowanieInstalling

Przed odwróceniem zespołu należy zainstalować Narzędzia PMC (tylko Visual Studio) lub Narzędzia interfejsu wiersza polecenia.Before reverse engineering, you'll need to install either the PMC tools (Visual Studio only) or the CLI tools. Zobacz linki, aby uzyskać szczegółowe informacje.See links for details.

Należy również zainstalować odpowiedniego dostawcę bazy danych dla schematu bazy danych, który ma być odtwarzany.You'll also need to install an appropriate database provider for the database schema you want to reverse engineer.

Parametry połączeniaConnection string

Pierwszym argumentem polecenia są parametry połączenia z bazą danych.The first argument to the command is a connection string to the database. Narzędzia użyją tych parametrów połączenia, aby odczytać schemat bazy danych.The tools will use this connection string to read the database schema.

Sposób tworzenia cudzysłowów i ucieczki parametrów połączenia zależy od powłoki, która jest używana do wykonywania polecenia.How you quote and escape the connection string depends on which shell you are using to execute the command. Szczegółowe informacje można znaleźć w dokumentacji powłoki.Refer to your shell's documentation for specifics. Na przykład program PowerShell wymaga znaku ucieczki $ , ale nie \ .For example, PowerShell requires you to escape the $ character, but not \.

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

Klucze tajne konfiguracji i użytkownikaConfiguration and User Secrets

Jeśli masz projekt ASP.NET Core, możesz użyć Name=<connection-string> składni, aby odczytać parametry połączenia z konfiguracji.If you have an ASP.NET Core project, you can use the Name=<connection-string> syntax to read the connection string from configuration.

Jest to dobre rozwiązanie przy użyciu Narzędzia tajnego Menedżera w celu zachowania podzielenia hasła bazy danych od kodu bazowej.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=ConnectionStrings.Chinook Microsoft.EntityFrameworkCore.SqlServer

Nazwa dostawcyProvider name

Drugi argument jest nazwą dostawcy.The second argument is the provider name. Nazwa dostawcy jest zwykle taka sama jak nazwa pakietu NuGet dostawcy.The provider name is typically the same as the provider's NuGet package name.

Określanie tabelSpecifying tables

Wszystkie tabele w schemacie bazy danych są domyślnie odtwarzane w postaci typów jednostek.All tables in the database schema are reverse engineered into entity types by default. Można ograniczyć, które tabele są odtworzone, określając schematy i tabele.You can limit which tables are reverse engineered by specifying schemas and tables.

--schemaOpcja może być używana do dołączania każdej tabeli w schemacie, natomiast --table może być używana do dołączania określonych tabel.The --schema option can be used to include every table within a schema, while --table can be used to include specific tables.

Aby dołączyć wiele tabel, określ opcję wiele razy:To include multiple tables, specify the option multiple times:

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

Jak to działaHow it works

Odtwarzanie rozpocznie się, odczytując schemat bazy danych.Reverse engineering starts by reading the database schema. Odczytuje informacje o tabelach, kolumnach, ograniczeniach i indeksach.It reads information about tables, columns, constraints, and indexes.

Następnie używa informacji o schemacie do tworzenia modelu EF Core.Next, it uses the schema information to create an EF Core model. Tabele są używane do tworzenia typów jednostek; kolumny są używane do tworzenia właściwości; i klucze obce są używane do tworzenia relacji.Tables are used to create entity types; columns are used to create properties; and foreign keys are used to create relationships.

Na koniec model jest używany do generowania kodu.Finally, the model is used to generate code. Odpowiednie klasy typu jednostki, interfejs API Fluent i adnotacje danych są szkieletami, aby można było ponownie utworzyć ten sam model z poziomu aplikacji.The corresponding entity type classes, Fluent API, and data annotations are scaffolded in order to re-create the same model from your app.

OgraniczeniaLimitations

  • Nie wszystkie elementy dotyczące modelu mogą być reprezentowane za pomocą schematu bazy danych.Not everything about a model can be represented using a database schema. Na przykład informacje o hierarchiach dziedziczenia, typach będących własnościąi podziałie tabeli nie są obecne w schemacie bazy danych.For example, information about inheritance hierarchies, owned types, and table splitting are not present in the database schema. W związku z tym konstrukcje te nigdy nie będą odtwarzane.Because of this, these constructs will never be reverse engineered.
  • Ponadto niektóre typy kolumn mogą nie być obsługiwane przez dostawcę EF Core.In addition, some column types may not be supported by the EF Core provider. Te kolumny nie zostaną uwzględnione w modelu.These columns won't be included in the model.
  • Można zdefiniować tokeny współbieżnościw modelu EF Core, aby uniemożliwić dwóm użytkownikom Aktualizowanie tej samej jednostki w tym samym czasie.You can define concurrency tokens, in an EF Core model to prevent two users from updating the same entity at the same time. Niektóre bazy danych mają specjalny typ reprezentujący ten typ kolumny (na przykład rowversion w SQL Server), w którym można odtworzyć te informacje. Jednak inne tokeny współbieżności nie będą odtwarzane.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.
  • Funkcja typ referencyjny języka C# 8 nie jest obecnie obsługiwana w przypadku odtwarzania: EF Core zawsze generuje kod C#, który zakłada, że ta funkcja jest wyłączona.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. Na przykład kolumny tekstu dopuszczające wartość null będą szkieletem jako właściwość typu string , a nie string? z interfejsem API Fluent lub adnotacjami danych używanymi do konfigurowania, czy właściwość jest wymagana.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. Można edytować kod szkieletowy i zastąpić je za pomocą adnotacji o wartości null w języku C#.You can edit the scaffolded code and replace these with C# nullability annotations. Obsługa tworzenia szkieletów dla typów odwołań do wartości null jest śledzona przez #15520problemu.Scaffolding support for nullable reference types is tracked by issue #15520.

Dostosowywanie modeluCustomizing the model

Kod wygenerowany przez EF Core to Twój kod.The code generated by EF Core is your code. Możesz go zmienić.Feel free to change it. Zostanie on wygenerowany ponownie tylko w przypadku ponownego odtworzenia tego samego modelu.It will only be regenerated if you reverse engineer the same model again. Kod szkieletowy reprezentuje jeden model, który może być używany w celu uzyskania dostępu do bazy danych, ale nie jest to jedyny model, który może być używany.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.

Dostosuj klasy typu jednostki i klasy DbContext do Twoich potrzeb.Customize the entity type classes and DbContext class to fit your needs. Można na przykład zmienić nazwy typów i właściwości, wprowadzić hierarchie dziedziczenia lub podzielić tabelę na wiele jednostek.For example, you may choose to rename types and properties, introduce inheritance hierarchies, or split a table into to multiple entities. Można również usunąć nieunikatowe indeksy, nieużywane sekwencje i właściwości nawigacji, opcjonalne właściwości skalarne i nazwy ograniczeń z modelu.You can also remove non-unique indexes, unused sequences and navigation properties, optional scalar properties, and constraint names from the model.

Można również dodać dodatkowe konstruktory, metody, właściwości itp.You can also add additional constructors, methods, properties, etc. użycie innej klasy częściowej w oddzielnym pliku.using another partial class in a separate file. Takie podejście działa nawet wtedy, gdy zamierzasz ponownie odtworzyć model.This approach works even when you intend to reverse engineer the model again.

Aktualizowanie modeluUpdating the model

Po wprowadzeniu zmian w bazie danych może być konieczne zaktualizowanie modelu EF Core w celu odzwierciedlenia tych zmian.After making changes to the database, you may need to update your EF Core model to reflect those changes. W przypadku, gdy baza danych jest prosta, może być najłatwiej ręcznie wprowadzić zmiany w modelu EF Core.If the database changes are simple, it may be easiest just to manually make the changes to your EF Core model. Na przykład zmiana nazwy tabeli lub kolumny, usunięcie kolumny lub aktualizacja typu kolumny to proste zmiany wprowadzane w kodzie.For example, renaming a table or column, removing a column, or updating a column's type are trivial changes to make in code.

Bardziej znaczące zmiany nie są jednak łatwe do ręcznego wprowadzania.More significant changes, however, are not as easy make manually. Jednym z typowych przepływów pracy jest ponowne odtwarzanie modelu z bazy danych przy użyciu -Force (PMC) lub --force (CLI), aby zastąpić istniejący model zaktualizowanym.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.

Inną często żądaną funkcją jest możliwość aktualizowania modelu z bazy danych przy zachowaniu dostosowania, takiego jak renames, hierarchie typów itd. Użyj #831 problemu, aby śledzić postęp tej funkcji.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.

Ostrzeżenie

Jeśli odwrócisz model z bazy danych, wszelkie zmiany wprowadzone w plikach zostaną utracone.If you reverse engineer the model from the database again, any changes you've made to the files will be lost.