Odtwarzanie

Inżynieria odwrotna to proces tworzenia szkieletu klas typów jednostek i klasy DbContext na podstawie schematu bazy danych. Można to zrobić za pomocą polecenia narzędzi EF Core Menedżer pakietów Console (PMC) lub polecenia narzędzi interfejsu wiersza polecenia Scaffold-DbContext dotnet ef dbcontext scaffold (CLI) programu .NET.

Instalowanie

Przed rozpoczęciem inżynierii odwrotnej należy zainstalować narzędzia PMC (tylko Visual Studio) lub narzędzia interfejsu wiersza polecenia. Zobacz linki, aby uzyskać szczegółowe informacje.

Należy również zainstalować odpowiedniego dostawcę bazy danych dla schematu bazy danych, który ma być inżynierem odwrotnym.

Parametry połączenia

Pierwszym argumentem polecenia są ciągi połączenia z bazą danych. Narzędzia będą używać tych parametrów połączenia do odczytywania schematu bazy danych.

Sposób cudzysłowu i ucieczki parametrów połączenia zależy od powłoki, której używasz do wykonania polecenia. Szczegółowe informacje można znaleźć w dokumentacji powłoki. Na przykład program PowerShell wymaga znaku $ ucieczki, ale nie znaku \ .

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

Konfiguracja i wpisy tajne użytkowników

Jeśli masz projekt ASP.NET Core, możesz użyć składni do Name=<connection-string> odczytania parametrów połączenia z konfiguracji.

To działa dobrze z narzędziem Secret Manager, aby przechowywać hasło bazy danych oddzielnie od bazy kodu.

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

Nazwa dostawcy

Drugim argumentem jest nazwa dostawcy. Nazwa dostawcy jest zwykle taka sama jak nazwa pakietu NuGet dostawcy.

Określanie tabel

Wszystkie tabele w schemacie bazy danych są domyślnie projektowane odwrotnie na typy jednostek. Tabele, które są zaprojektowane odwrotnie, można ograniczyć, określając schematy i tabele.

Opcja --schema może służyć do dołączania każdej tabeli w schemacie, natomiast może służyć do --table dołączania określonych tabel.

Aby uwzględnić wiele tabel, należy określić opcję wiele razy:

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

Zachowywanie nazw

Nazwy tabel i kolumn są domyślnie ustalane w celu lepszego dopasowania do konwencji nazewnictwa .NET dla typów i właściwości. Określenie przełącznika w konfiguracji PMC lub opcji w interfejs wiersza polecenia platformy .NET Core spowoduje wyłączenie tego zachowania przy zachowaniu oryginalnych nazw baz danych tak bardzo, jak -UseDatabaseNames --use-database-names to możliwe. Nieprawidłowe identyfikatory .NET nadal będą stałe, a zsyntetyzowane nazwy, takie jak właściwości nawigacji, będą nadal zgodne z konwencjami nazewnictwa .NET.

Fluent Adnotacje interfejsu API lub danych

Typy jednostek są domyślnie konfigurowane przy użyciu Fluent API. Określ -DataAnnotations (PMC) lub --data-annotations (interfejs wiersza polecenia platformy .NET Core), aby zamiast tego używać adnotacji danych, gdy jest to możliwe.

Na przykład użycie interfejsu API Fluent spowoduje szkielet tego:

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

Podczas korzystania z adnotacji danych zostaną one szkieletem:

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

Nazwa dbContext

Nazwa klasy DbContext z szkieletem będzie nazwą bazy danych z sufiksem Context domyślnie. Aby określić inny, użyj w -Context pmc i --context w interfejs wiersza polecenia platformy .NET Core.

Katalogi i przestrzenie nazw

Klasy jednostek i klasa DbContext są szkieletami w katalogu głównym projektu i używają domyślnej przestrzeni nazw projektu.

Możesz określić katalog, w którym klasy są szkieletami przy użyciu klasy , i może służyć do tworzenia szkieletu klasy DbContext w osobnym katalogu od klas --output-dir --context-dir typu jednostki:

dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

Domyślnie przestrzeń nazw będzie główną przestrzenią nazw oraz nazwami wszystkich podkatalogów w katalogu głównym projektu. Jednak począwszy od platformy EFCore 5.0, przestrzeń nazw dla wszystkich klas danych wyjściowych można zastąpić za pomocą metody --namespace . Możesz również zastąpić przestrzeń nazw tylko dla klasy DbContext przy użyciu metody --context-namespace :

dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace

Jak to działa

Odwrotna inżynieria rozpoczyna się od odczytania schematu bazy danych. Odczytuje informacje o tabelach, kolumnach, ograniczeniach i indeksach.

Następnie używa informacji o schemacie do utworzenia EF Core modelu. Tabele służą do tworzenia typów jednostek; Kolumny są używane do tworzenia właściwości; Klucze obce i są używane do tworzenia relacji.

Na koniec model jest używany do generowania kodu. Odpowiednie klasy typów jednostek, Fluent API i adnotacje danych są tworzyć szkielety w celu ponownego utworzenia tego samego modelu z aplikacji.

Ograniczenia

  • Nie wszystkie informacje o modelu mogą być reprezentowane przy użyciu schematu bazy danych. Na przykład informacje o hierarchiach dziedziczenia, posiadanych typachi dzieleniu tabel nie są obecne w schemacie bazy danych. W związku z tym te konstrukcje nigdy nie zostaną zaprojektowane odwrotnie.
  • Ponadto niektóre typy kolumn mogą nie być obsługiwane przez EF Core dostawcę. Te kolumny nie zostaną uwzględnione w modelu.
  • Tokeny współbieżnościmożna zdefiniować w modelu EF Core, aby uniemożliwić dwóch użytkownikom aktualizowanie tej samej jednostki w tym samym czasie. Niektóre bazy danych mają specjalny typ reprezentujący ten typ kolumny (na przykład rowversion in SQL Server), w którym to przypadku możemy odwrócić te informacje. Jednak inne tokeny współbieżności nie zostaną zaprojektowane odwrotnie.
  • Funkcja typu referencyjnego dopuszczania wartości null w języku C# 8 nie jest obecnie obsługiwana w inżynierii odwrotnej: program EF Core zawsze generuje kod języka C#, który zakłada, że funkcja jest wyłączona. Na przykład kolumny tekstowe dopuszczane wartością null będą szkieletem jako właściwość o typie , a nie , z interfejsem API usługi Fluent lub adnotacjami danych używanymi do konfigurowania, czy właściwość jest wymagana, string string? czy nie. Możesz edytować kod z szkieletem i zastąpić go adnotacjami dopuszczania wartości null w języku C#. Obsługa tworzenia szkieletów dla typów referencyjnych dopuszczających wartość null jest śledzona przez problem #15520.

Dostosowywanie modelu

Kod wygenerowany przez EF Core to Twój kod. Możesz ją zmienić. Zostanie on ponownie wygenerowany tylko w przypadku ponownego inżyniera odwrotnego tego samego modelu. Kod z szkieletem reprezentuje jeden model, który może służyć do uzyskiwania dostępu do bazy danych, ale z pewnością nie jest jedynym modelem, który może być używany.

Dostosuj klasy typów jednostek i klasę DbContext do swoich potrzeb. Można na przykład zmienić nazwy typów i właściwości, wprowadzić hierarchie dziedziczenia lub podzielić tabelę na wiele jednostek. Z modelu można również usunąć nieużyteczne indeksy, nieużywane sekwencje i właściwości nawigacji, opcjonalne właściwości skalarne i nazwy ograniczeń.

Można również dodać dodatkowe konstruktory, metody, właściwości itp. przy użyciu innej klasy częściowej w oddzielnym pliku. Takie podejście działa nawet wtedy, gdy zamierzasz ponownie odwrócić model.

Aktualizowanie modelu

Po w związku z wprowadzeniem zmian w bazie danych może być konieczne zaktualizowanie modelu EF Core w celu odzwierciedlenia tych zmian. Jeśli zmiany bazy danych są proste, najłatwiej jest po prostu ręcznie wprowadzić zmiany w EF Core modelu. Na przykład zmiana nazwy tabeli lub kolumny, usunięcie kolumny lub zaktualizowanie typu kolumny to bardzo trywialne zmiany, które należy wprowadzić w kodzie.

Jednak bardziej znaczące zmiany nie są tak łatwe do ręcznego. Jednym z typowych przepływów pracy jest odwrócenie modelu z bazy danych ponownie przy użyciu interfejsu wiersza polecenia (PMC) lub w celu zastąpienia istniejącego modelu -Force --force zaktualizowanym.

Inną często żądaną funkcją jest możliwość zaktualizowania modelu z bazy danych przy zachowaniu dostosowania, takiego jak zmiany nazwy, hierarchie typów itp. Użyj #831, aby śledzić postęp tej funkcji.

Ostrzeżenie

Jeśli model zostanie ponownie zaprojektowany z bazy danych, wszelkie zmiany wprowadzone w plikach zostaną utracone.

Porada

Jeśli używasz narzędzia Visual Studio, rozszerzenie społeczności narzędzi EF Core Power Tools, graficzne narzędzie bazujące na narzędziach wiersza polecenia programu EF Core, oferuje dodatkowe opcje przepływu pracy i dostosowywania.