Podrobné případy přenosu z EF6 do EF Core

Tento dokument podrobně popisuje některé konkrétní rozdíly mezi EF6 a EF Core. Při přenosu kódu si projděte tuto příručku.

Konfigurace připojení k databázi

Existuje několik rozdílů mezi tím, jak se EF6 připojuje k různým zdrojům dat v porovnání s EF Core. Je důležité pochopit, kdy kód portujete.

  • Připojení ionové řetězce: EF Core nepodporuje přímo více přetížení konstruktoru pro různé připojovací řetězec jako EF6. Místo toho spoléhá na DbContextOptions. V odvozených typech můžete stále zadat více přetížení konstruktoru, ale budete muset mapovat připojení prostřednictvím možností.
  • Konfigurace a mezipaměť: EF Core podporuje robustnější a flexibilnější implementaci injektáže závislostí s interní infrastrukturou, která se může připojit k externím poskytovatelům služeb. To může aplikace spravovat, aby zvládla situace, kdy je potřeba vyprázdnit mezipaměti. Verze EF6 byla omezená a nelze ji vyprázdnit.
  • Konfigurační soubory: EF6 podporuje konfiguraci prostřednictvím konfiguračních souborů, které můžou zahrnovat poskytovatele. EF Core vyžaduje přímý odkaz na sestavení zprostředkovatele a explicitní registraci poskytovatele (tj. UseSqlServer).
  • Připojení ionové továrny: Podporované továrny pro připojení EF6. EF Core nepodporuje továrny připojení a vždy vyžaduje připojovací řetězec.
  • Protokolování: Obecně platí, že protokolování v EF Core je mnohem robustnější a má několik možností pro vyladěnou konfiguraci.

Konvence

Ef6 podporoval vlastní ("odlehčené") konvence a konvence modelů. Zjednodušené konvence jsou podobné konfiguraci modelu před konvencí EF Core. Další konvence jsou podporovány jako součást vytváření modelů.

EF6 spouští konvence po sestavení modelu. EF Core je použije při sestavení modelu. V EF Core můžete oddělit model od aktivních relací pomocí DbContext. Model inicializovaný pomocí konvencí je možné vytvořit.

Ověření dat

EF Core nepodporuje ověřování dat a používá pouze datové poznámky k sestavení modelu a migrace. Většina klientských knihoven z webu nebo MVC do WinForms a WPF poskytuje implementaci ověření dat, která se má použít.

Funkce, které budou brzy k dispozici

Ef6 obsahuje několik funkcí, které ještě v EF Core neexistují, ale jsou v plánu produktu.

  • Tabulka na konkrétní typ (TPC) byla v EF6 podporována spolu s rozdělením entit. TPC je v plánu pro EF7.
  • Mapování uložených procedur v EF6 umožňuje delegovat operace vytváření, aktualizace a odstraňování na uložené procedury. EF Core v současné době umožňuje mapování jenom na uložené procedury pro čtení. Podpora vytvoření, aktualizace a odstranění (CUD) je v plánu pro EF7.
  • Složité typy v EF6 se podobají vlastněným typům v EF Core. Úplná sada funkcí se ale bude řešit s objekty hodnot v EF7.

Ponechání objektu ObjectContext za sebou

EF Core používá dbContext místo ObjectContext. Budete muset aktualizovat kód, který používá IObjectContextAdapter. To se někdy použilo pro dotazy s PreserveChanges možností sloučení nebo OverwriteChanges sloučení. V případě podobných funkcí v EF Core se podívejte na metodu Opětovné načtení .

Konfigurace modelu

Existuje mnoho důležitých rozdílů mezi tím, jak jsou modely v EF6 a EF Core navrženy. EF Core nemá úplnou podporu podmíněného mapování. Neobsahuje verze tvůrce modelů.

Mezi další rozdíly patří:

Zjišťování typů

V EF Core jsou typy entit zjištěny modulem třemi způsoby:

  • Zveřejněte DbSet<TEntity> místo, DbContext kde TEntity je typ, který chcete sledovat.
  • Odkazujte někde Set<TEntity> v kódu.
  • Komplexní typy odkazované zjištěnými typy jsou rekurzivně zjištěny (například pokud vaše Blog odkazy na a PostBlog jsou zjistitelné, Post budou zjištěny také).

Sestavení se neskenují pro odvozené typy.

mapování.

Rozšíření .Map() v EF6 bylo nahrazeno přetíženími a rozšiřujícími metodami v EF Core. Můžete například použít ". Has Provideror() pro konfiguraci tabulky na hierarchii (TPH). Viz: Modelování dědičnosti.

Mapování dědičnosti

EF6 podporuje tabulku na hierarchii (TPH), tabulku na typ (TPT) a tabulku na konkrétní třídu (TPC) a povolila hybridní mapování různých příchutí na různých úrovních hierarchie. EF Core bude nadále vyžadovat řetěz dědičnosti pro modelovaný jedním ze způsobů (TPT nebo TPH) a plán je přidat podporu pro TPC v EF7.

Viz: Modelování dědičnosti.

Atributy

U vlastností podporuje ef6 podporované atributy indexu. V EF Core se použijí na úrovni typu, což by mělo usnadnit scénáře, které vyžadují složené indexy. EF Core nepodporuje složené klíče s datovými poznámkami (tj. použití pořadí ColumnAttribute společně s KeyAttribute).

Další informace najdete v tématu: Indexy a omezení.

Povinné a volitelné

V modelu EF Core konfiguruje jenom to, IsRequired co je potřeba na konci objektu zabezpečení. HasForeignKey teď nakonfiguruje konec objektu zabezpečení. Pokud chcete kód přenést, bude jednodušší místo toho použít .Navigation().IsRequired() . Příklad:

EF6:

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

EF Core 6:

modelBuilder.Entity<Instructor>()
    .HasOne(t => t.OfficeAssignment)
    .WithOne(t => t.Instructor)
    .HasForeignKey<OfficeAssignment>();

modelBuilder.Entity<Instructor>()
    .Navigation(t => t.OfficeAssignment)
    .IsRequired();

modelBuilder.Entity<OfficeAssignment>()
    .Navigation(t => t.Instructor)
    .IsRequired();

Ve výchozím nastavení je vše volitelné, takže obvykle není nutné volat .IsRequired(false).

Prostorová podpora

EF Core se integruje s knihovnou knihovny třetích stran NetTopologySuite a poskytuje prostorovou podporu.

Nezávislá přidružení

EF Core nepodporuje nezávislá přidružení (koncept EDM, který umožňuje definovat vztah mezi dvěma entitami nezávisle na samotných entitách). Podobný koncept podporovaný v EF Core je stínové vlastnosti.

Migrace

EF Core nepodporuje inicializátory databáze ani automatické migrace. I když ef Core neexistuje migrate.exe , můžete vytvořit migrační sady.

Nástroje sady Visual Studio

EF Core nemá žádný návrhář, žádné funkce pro aktualizaci modelu z databáze a žádný tok první model. Neexistuje žádný průvodce zpětnou technikou a žádné předdefinované šablony.

I když tyto funkce nejsou dodávány s EF Core, existují komunitní projekty OSS, které poskytují další nástroje. Nástroje EF Core Power Tools konkrétně poskytují:

  • Zpětná analýza ze sady Visual Studio s podporou databázových projektů (.dacpac). Zahrnuje přizpůsobení kódu založeného na šabloně.
  • Vizuální kontrola DbContext pomocí grafů modelů a skriptování
  • Správa migrací ze sady Visual Studio pomocí grafického uživatelského rozhraní

Úplný seznam nástrojů a rozšíření komunity najdete v tématu: EF Core Tools and Extensions.

Sledování změn

Mezi tím, jak EF6 a EF Core řeší sledování změn, je několik rozdílů. Toto jsou shrnuté v následující tabulce:

Funkce EF6 EF Core
Stav entity Přidá nebo připojí celý graf. Podporuje navigace pro odpojené entity.
Sirotky Zachovány Odstraněné
Odpojené, sebesledovací entity Podporováno Nepodporováno
Mutace Provedeno s vlastnostmi Provedeno u záložních polí*
Datová vazba .Local .Local plus .ToObservableCollection nebo .ToBindingList
Detekce změn Úplný graf Na entitu

* Ve výchozím nastavení se oznámení o vlastnosti neaktivuje v EF Core, takže je důležité nakonfigurovat entity oznámení.

Mějte na paměti, že EF Core nevolá detekci změn automaticky tak často jako EF6.

EF Core zavádí podrobné informace DebugView o sledování změn. Další informace najdete v tématu Ladění sledování změn.

Dotazy

EF6 má některé možnosti dotazů, které v EF Core neexistují. Tady jsou některé z nich:

  • Některé běžné mapování funkcí jazyka C# a funkcí SQL
  • Zachycení stromu příkazů pro dotazy a aktualizace
  • Podpora parametrů s hodnotami tabulky (TVP).

EF6 má integrovanou podporu pro opožděné načítání proxy serverů. Jedná se o volitelný balíček pro EF Core (viz Opožděné načítání souvisejících dat).

EF Core umožňuje vytvářet přes nezpracovaný SQL pomocí FromSQL.