Zpětná analýza

Reverzní inženýrství je proces generování tříd typů entit a třídy DbContext založené na schématu databáze. Můžete ho provést pomocí Scaffold-DbContext příkazu nástrojů EF Core Správce balíčků Console (PMC) nebo dotnet ef dbcontext scaffold pomocí příkazů rozhraní příkazového řádku .NET (CLI).

Požadavky

  • Před zpětnou technikou budete muset nainstalovat nástroje PMC (pouze Visual Studio) nebo nástroje rozhraní příkazového řádku. Podrobnosti najdete na odkazech.
  • Nainstalujte balíček NuGet pro Microsoft.EntityFrameworkCore.Design projekt, do který vygenerujete uživatelské rozhraní.
  • Budete také muset nainstalovat vhodného zprostředkovatele databáze pro schéma databáze, které chcete provést zpětnou analýzu.

Připojovací řetězec

Prvním argumentem příkazu je připojovací řetězec k databázi. Nástroje budou tento připojovací řetězec používat ke čtení schématu databáze.

Jak uvozujete a uvozujete připojovací řetězec, závisí na tom, které prostředí používáte ke spuštění příkazu. Konkrétní informace najdete v dokumentaci prostředí. PowerShell například vyžaduje, abyste uchytli $ znak, ale ne \.

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

Konfigurace a tajné kódy uživatelů

Pokud máte projekt ASP.NET Core, můžete pomocí Name=<connection-string> syntaxe přečíst připojovací řetězec z konfigurace.

To funguje dobře s nástrojem Secret Manager , aby heslo databáze bylo oddělené od základu kódu.

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

Název zprostředkovatele

Druhým argumentem je název zprostředkovatele. Název zprostředkovatele je obvykle stejný jako název balíčku NuGet poskytovatele.

Určení tabulek

Všechny tabulky ve schématu databáze se ve výchozím nastavení převedou na typy entit. Můžete omezit, které tabulky jsou zpětně analyzovány zadáním schémat a tabulek.

Tuto --schema možnost lze použít k zahrnutí každé tabulky do schématu, zatímco --table lze použít k zahrnutí konkrétních tabulek.

Pokud chcete zahrnout více tabulek, zadejte možnost několikrát:

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

Zachování názvů

Názvy tabulek a sloupců jsou ve výchozím nastavení opraveny tak, aby odpovídaly konvencím vytváření názvů .NET pro typy a vlastnosti. Zadání -UseDatabaseNames přepínače v PMC nebo --use-database-names možnosti v rozhraní příkazového řádku .NET Core zakáže toto chování, které zachová původní názvy databází co nejvíce. Neplatné identifikátory .NET budou i nadále opravené a syntetizované názvy, jako jsou vlastnosti navigace, budou nadále odpovídat konvencím pojmenování .NET.

Fluent API nebo datových poznámek

Typy entit se ve výchozím nastavení konfigurují pomocí rozhraní FLUENT API. Pokud je to možné, zadejte -DataAnnotations (PMC) nebo --data-annotations (.NET Core CLI) a místo toho použijte datové poznámky.

Například pomocí rozhraní API Fluent se vygeneruje toto:

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

Při používání datových poznámek se vygeneruje toto:

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

Název DbContext

Vygenerovaný název třídy DbContext bude ve výchozím nastavení název přípony databáze s kontextem . Pokud chcete zadat jinou, použijte -Context ji v PMC a --context v rozhraní příkazového řádku .NET Core.

Adresáře a obory názvů

Třídy entit a třída DbContext se vygenerují do kořenového adresáře projektu a používají výchozí obor názvů projektu.

Můžete zadat adresář, ve kterém jsou třídy vygenerovány pomocí --output-dir, a --context-dir lze ho použít k generování generování třídy DbContext do samostatného adresáře od tříd typů entit:

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

Ve výchozím nastavení bude obor názvů kořenovým oborem názvů a názvy všech podadresářů v kořenovém adresáři projektu. Od EFCore 5.0 však můžete přepsat obor názvů pro všechny výstupní třídy pomocí --namespace. Obor názvů můžete také přepsat pouze pro třídu DbContext pomocí --context-namespace:

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

Jak to funguje

Zpětné inženýrství začíná čtením schématu databáze. Přečte informace o tabulkách, sloupcích, omezeních a indexech.

V dalším kroku použije informace o schématu k vytvoření modelu EF Core. Tabulky slouží k vytváření typů entit; sloupce slouží k vytváření vlastností; a cizí klíče slouží k vytváření relací.

Nakonec se model používá k vygenerování kódu. Odpovídající třídy typů entit, rozhraní API Fluent a datové poznámky se vygenerují, aby bylo možné z aplikace znovu vytvořit stejný model.

Omezení

  • Ne všechno o modelu lze reprezentovat pomocí schématu databáze. Například informace o hierarchiích dědičnosti, vlastněných typech a rozdělení tabulek se ve schématu databáze nezobrazují. Z tohoto důvodu nebudou tyto konstrukce nikdy zpětně analyzovány.
  • Kromě toho některé typy sloupců nemusí být podporovány poskytovatelem EF Core. Tyto sloupce nebudou součástí modelu.
  • Tokeny souběžnosti můžete definovat v modelu EF Core, aby dva uživatelé nemohli aktualizovat stejnou entitu současně. Některé databáze mají speciální typ, který představuje tento typ sloupce (například rowversion in SQL Server), v takovém případě můžeme tyto informace převést zpět. Jiné tokeny souběžnosti ale nebudou zpětně analyzovány.
  • Před EF Core 6 nebyla funkce typu odkazu c# 8 s možnou hodnotou null podporována v zpětném inženýrství: EF Core vždy vygeneroval kód jazyka C#, který předpokládal, že je tato funkce zakázaná. Například textové sloupce s možnou hodnotou null byly vygenerovány jako vlastnost s typem string , ne string?s rozhraním API Fluent nebo datovými poznámkami použitými ke konfiguraci, zda je vlastnost povinná nebo ne. Pokud používáte starší verzi EF Core, můžete stále upravovat vygenerovaný kód a nahradit je poznámkami k nullability jazyka C#.

Přizpůsobení modelu

Kód vygenerovaný EF Core je váš kód. Nebojte se ho změnit. Znovu se vygeneruje pouze v případě, že znovu provedete zpětnou analýzu stejného modelu. Vygenerovaný kód představuje jeden model, který lze použít pro přístup k databázi, ale určitě to není jediný model, který lze použít.

Přizpůsobte třídy typů entit a třídu DbContext tak, aby vyhovovaly vašim potřebám. Můžete se například rozhodnout přejmenovat typy a vlastnosti, zavést hierarchie dědičnosti nebo rozdělit tabulku na několik entit. Můžete také odebrat ne jedinečné indexy, nepoužívané sekvence a vlastnosti navigace, volitelné skalární vlastnosti a názvy omezení z modelu.

Můžete také přidat další konstruktory, metody, vlastnosti atd. použití jiné částečné třídy v samostatném souboru. Tento přístup funguje i v případě, že chcete model znovu analyzovat.

Aktualizace modelu

Po provedení změn v databázi možná budete muset aktualizovat model EF Core tak, aby odrážel tyto změny. Pokud jsou změny databáze jednoduché, může být nejjednodušší provést změny modelu EF Core ručně. Například přejmenování tabulky nebo sloupce, odebrání sloupce nebo aktualizace typu sloupce jsou triviální změny provedené v kódu.

Důležitější změny ale nejsou tak snadné provést ručně. Jedním z běžných pracovních postupů je přepsat model z databáze znovu pomocí -Force (PMC) nebo --force (CLI) k přepsání existujícího modelu aktualizovaným pracovním postupem.

Další často požadovanou funkcí je možnost aktualizovat model z databáze a zachovat přizpůsobení, jako jsou přejmenování, hierarchie typů atd. K sledování průběhu této funkce použijte problém č. 831 .

Upozornění

Pokud model z databáze znovu překonstruujete, všechny změny provedené v souborech budou ztraceny.

Tip

Pokud používáte Visual Studio, nabízí rozšíření komunity EF Core Power Tools grafický nástroj, který vychází z nástrojů příkazového řádku EF Core, nabízí další možnosti pracovního postupu a přizpůsobení.