Přenesení z EF6 do EF Core

Entity Framework Core, zkráceně EF Core, je zcela přepsaná verze technologie Entity Framework pro moderní aplikační architektury. Vzhledem k zásadním změnám neexistuje přímá cesta upgradu. Účelem této dokumentace je poskytnout kompletního průvodce přenesením aplikací EF6 do EF Core.

Důležité

Než zahájíte proces přenesení, je důležité ověřit, že EF Core splňuje požadavky na přístup k datům pro vaši aplikaci. Všechno, co potřebujete, najdete v dokumentaci pro EF Core.

Důležité

Existuje známý problém (microsoft/dotnet-apiport #993) s analyzátorem přenositelnosti, který chybně hlásí EF Core jako nekompatibilní s .NET 5 a .NET 6. Tato upozornění se dají bezpečně ignorovat, protože EF Core je 100% kompatibilní s cílovými architekturami .NET 5 a .NET 6.

Důvody k upgradu

V rámci EF Core probíhá zcela nový vývoj technologie Entity Framework. Neexistují žádné plány na přenesení nových funkcí zpět do EF6. EF Core běží na nejnovějších modulech runtime .NET a naplno využívá funkce modulů runtime, funkce specifické pro platformu (například ASP.NET Core nebo WPF) a funkce specifické pro jazyk. Tady je několik výhod, které získáte při upgradu:

  • Využijte průběžné vylepšování výkonu v EF Core. Jeden zákazník, který migroval z EF6 do EF Core 6, například zaznamenal 40násobné snížení využití náročných dotazů díky funkci dělení dotazů. Mnoho zákazníků hlásí obrovské zvýšení výkonu jednoduše díky přechodu na nejnovější EF Core.
  • Používejte nové funkce v EF Core. Do EF6 se nebudou přidávat žádné nové funkce. Všechny nové funkce, například poskytovatel Azure Cosmos DB a DbContextFactory, budou přidány jenom do EF Core. Úplné porovnání EF6 s EF Core, včetně několika funkcí exkluzivních pro EF Core, najdete v tématu: Porovnání EF Core a EF6.
  • Modernizujte svůj zásobník aplikací pomocí injektáže závislostí a bezproblémově integrujte přístup k datům s technologiemi, jako jsou gRPC a GraphQL.

Poznámka k migracím

Tato dokumentace používá termíny přenesení a upgrade, aby se nepletly s termínem migrace jako funkcí EF Core. Migrace v EF Core nejsou kompatibilní s migracemi Code First v EF6 z důvodu významných vylepšení způsobu zpracování migrací. Neexistuje žádný doporučený přístup k přenesení historie migrací, takže v EF Core si naplánujte úplně nový začátek. Kódovou bázi a data z migrací EF6 můžete zachovat. Použijte finální migraci v EF6 a pak vytvořte počáteční migraci v EF Core. Pak budete moct sledovat historii v EF Core.

Kroky při upgradu

Cesta upgradu byla rozdělena do několika dokumentů, které jsou uspořádané podle fáze upgradu a typu aplikace.

Určení varianty EF Core

Existuje několik přístupů k tomu, jak bude EF Core fungovat s vaší implementací doménového modelu a databáze. Obecně platí, že většina aplikací bude sledovat jeden z těchto vzorů a přístup k přenesení bude záviset na variantě aplikace.

Kód jako zdroj pravdy je přístup, při kterém se vše modeluje prostřednictvím kódu a tříd, ať už prostřednictvím atributů dat, plynulé konfigurace nebo kombinace obou. Databáze se zpočátku generuje na základě modelu definovaného v EF Core a další aktualizace se obvykle zpracovávají prostřednictvím migrací. Tento přístup se často označuje jako „Code First“ (napřed kód), ale není to úplně přesné, protože jedním z možných přístupů je začít s existující databází, generovat entity a pak používat kód k údržbě.

Přístup Databáze jako zdroj pravdy zahrnuje zpětnou analýzu nebo generování kódu z databáze. Po provedení změn schématu se kód vygeneruje znovu nebo se aktualizuje tak, aby odrážel změny. Tento přístup se často označuje jako „Database First“ (napřed databáze).

A konečně pokročilejší přístup s hybridním mapováním se řídí filosofií, že kód a databáze se spravují samostatně a EF Core se používá k mapování mezi nimi. Při tomto přístupu se obvykle nepoužívají migrace.

Následující tabulka shrnuje některé základní rozdíly:

Přístup Role vývojáře Role DBA Migrace Generování uživatelského rozhraní Repo
Code First Návrh entit a ověření nebo přizpůsobení vygenerovaných migrací Ověření definic a změn schématu Při každém potvrzení Sledování entit, DbContextu a migrací
Database First Zpětné analýzy po změnách a ověření vygenerovaných entit Informování vývojářů o změnách databáze a potřebě opětovného generování Při každé změně schématu Sledování rozšíření nebo částečných tříd, které rozšiřují vygenerované entity
Hybridní model Aktualizace plynulé konfigurace v zájmu mapování při každé změně entit nebo databáze Informování vývojářů o změnách databáze, aby mohli aktualizovat entity a konfiguraci modelu N/A Sledování entit a DbContextu

Hybridní přístup je pokročilejší, ale v porovnání s tradičními přístupy upřednostňujícími kód nebo databázi má vyšší režii.

Ukončení podpory formátu EDMX a jeho dopad

Technologie EF6 podporovala speciální formát definice modelu s názvem EDMX (Entity Data Model XML). Soubory EDMX obsahují různé definice, včetně definic logických schémat (CSDL), specifikací mapování (MSL) a definic schémat ukládání (SSDL). EF Core sleduje schémata pro domény, mapování a databáze prostřednictvím interních grafů modelů a formát EDMX nepodporuje. Mnoho blogových příspěvků a článků omylem uvádí, že to znamená, že EF Core podporuje jenom přístup Code First. Ve skutečnosti ale EF Core podporuje všechny tři modely aplikací popsané v předchozí části. Model můžete v EF Core znovu sestavit pomocí zpětné analýzy databáze. Pokud používáte EDMX pro vizuální znázornění modelu entit, zvažte použití opensourcových nástrojů EF Core Power Tools, které poskytují podobné funkce pro EF Core.

Další informace o dopadu ukončení podpory souborů EDMX najdete v průvodci přenesením ze souborů EDMX.

Provedení kroků upgradu

Není nutné přenést celou aplikaci. EF6 a EF Core se dají spustit ve stejné aplikaci (viz použití EF Core a EF6 ve stejné aplikaci). Pokud chcete minimalizovat riziko, zvažte tyto možnosti:

  1. Pokud jste to ještě neudělali, přejděte na EF6 v .NET Core.
  2. Migrujte malou část aplikace do EF Core a spusťte ji souběžně s EF6.
  3. Nakonec přeneste zbytek kódové báze do EF Core a vyřaďte kód EF6.

Samotné přenesení sestává – stručně řečeno – z těchto kroků:

  1. Zkontrolujte změny chování mezi EF6 a EF Core.
  2. Proveďte případné finální migrace v EF6.
  3. Vytvořte projekt EF Core.
  4. Zkopírujte kód do nového projektu, spusťte zpětnou analýzu nebo použijte kombinaci obojího.
  5. Přejmenování odkazů a entit a chování aktualizací:
    • System.Data.Entity na Microsoft.EntityFrameworkCore
    • Změňte konstruktor DbContext tak, aby využíval možnosti a/nebo přepsal OnConfiguring.
    • DbModelBuilder na ModelBuilder
    • Přejmenujte DbEntityEntry<T> na EntityEntry<T>.
    • Přejděte z Database.Log na rozhraní API Microsoft.Extensions.Logging (pokročilejší) nebo DbContextOptionsBuilder.LogTo (jednodušší).
    • Použijte změny pro WithRequired a WithOptional (další informace najdete tady).
    • Aktualizujte ověřovací kód. Do EF Core není integrované žádné ověřování dat, ale můžete to udělat sami.
    • Proveďte všechny nezbytné kroky pro přenesení ze souborů EDMX.
  6. Proveďte konkrétní kroky na základě přístupu EF Core:

Existuje mnoho aspektů, které se týkají všech přístupů, takže budete také chtít zkontrolovat způsoby, jak řešit detailní rozdíly mezi EF6 a EF Core.