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
kdeTEntity
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 aPost
Blog
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
.