Miroslav Holec
Premium

Entity Framework Core 2.1 vs EF 6, rozdíly, použití v produkci a smysl migrace

Miroslav Holec   14. května 2018  update 20. června 2020

Článek se vztahuje k verzi produktu EF 6 / EF Core 2.1

Tento článek je již zastaralý. Článek nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.

Již verze EF Core 2.0 byla pro mnoho projektů dostačující a vhodná k implementaci do produkčních aplikací pro konečné zákazníky. Verze EF Core 2.1 přináší plno novinek, které v předešlé verzi chyběly a bránily mnoha vývojářům v použití. V tomto článku popíšu aktuální rozdíly mezi EF 6 a EF Core 2.1 a zda má smysl uvažovat například nad samotným přechodem.

👨‍🎓 Nové školení EF Core pro rok 2020

Školení nejnovější verze Entity Framework Core přímo u Vás ve firmě. Naučíte se používat EF Core v celém životním cyklu aplikace od vytvoření modelu, změn v podobě migrací až po dotazování a profilování databázových dotazů.

Více o školení Entity Framework Core

EF 6 / EF Core 2.1 a možnosti použití

Prvním zásadním rozdílem mezi EF 6 a EF Core 2.1 jsou možnosti využití v různých typech aplikací. Snahou Microsoftu je dostat EF Core všude, kde je .NET a tento záměr se aktuálně daří naplnit. EF Core 2.1 je možné použít v .NET Core aplikacích (konzolovky, webové aplikace) i v aplikacích napsaných nad .NET Frameworkem od verze 4.6.1. Další možnosti využití jsou pro UWP aplikace a do určité míry i nad Mono, byť tady je podpora podstatně horší.

Entity Framework 6 je použitelný s tradičním .NET Frameworkem 4.0 a novějším (starší verze EF byly dodávány přímo s .NET Frameworkem). Dle aktuálních informací bude možné v budoucnu použít EF 6 i v .NET Core 3.0 aplikacích s Windows Desktop Packem (a logicky podporou pouze na platformě Windows).

Z hlediska použitelnosti má tedy náskok EF Core 2.1.

Providers a 3rd party tooling

Dalším aspektem, který může ovlivnit volbu mezi EF 6 a EF Core 2.1 jsou existující providers pro různé databáze a dodatečný tooling. V tomto ohledu existuje pro EF Core 2.1 několik providerů, které podporují většinu běžných databázových systémů. Řada z nich je teprve v preview verzích a teprve je čeká stabilizace do produkčního použití. Zde je nutná určitá obezřetnost. Pokud však plánujete používat EF Core 2.1 výhradně s Microsoft SQL Serverem, pak se není čeho obávat.

Jste-li zvyklí používat speciální nástroje například pro profilování a optimalizaci generovaných dotazů (Entity Framework Profiler aj.)., je vhodné zkontrolovat podporu. Zrovna v této oblasti lze pro EF Core 2.1 použít Mini Profiler. Kromě profilerů je potřeba zamyslet se dále nad různými rozšířeními, generátory kódu, utilitami napsanými nad EF atd. Většina z nich ještě nemusí (a spíše nebude) pro EF Core existovat.

V oblasti providerů a toolingu má historický náskok EF a podpora pro EF Core 2.1 bude teprve růst. Pro většinu vývojářů je však aktuálně dostupné nářadí dostačující.

Funkce specifické pro EF Core 2.1 (nejsou v EF 6)

Nová verze EF Core 2.1 přinesla oproti 2.0 mnoho novinek a minor označení v sobě skrývá velký příval užitečných funkcí. EF Core 2.1 má podstatně lepší podporu práce s více DbContexty + DbContext Pooling, lepší a bezpečnější práci s raw SQL (+podpora string interpolation), podporu explicit loadingu pro zděděné typy, mapování skalárních funkcí, podporu globálních filtrů, výrazně lepší práce s komplexními typy a nové možnosti mapování bez foreign keys.

Fluent API pro mapování a popis modelu bylo z mého pohledu pěkně učesáno a nabízí smysluplnější a schopnější možnosti nastavení vztahů mezi entitami a velmi pěkné možnosti nastavení komplexních typů až na úroveň vlastností. Z oblasti enumů a primitivních typů přibyla možnost vlastních value konverzí včetně řady již předpřipravených (např.: enum to number, enum to string, atd.).

Trochu rozpačitější jsem z parametrických konstruktorů, které umožní automaticky injectnout do POCO tříd samotný DbContext a použít jej buď k dodatečnému validování nebo custom lazy loadingu, který je dostupný v EF Core 2.1.

Celkově mi přijde, že EF Core 2.1 poskytuje plno malých užitečných funkcí, které v EF 6 nejsou a které jako vývojář ocením.

Funkce specifické pro EF 6 (které nejsou v EF 2.1)

Tradiční EF 6 má historicky řadu funkcí, které v EF Core nejsou a některé dokonce (naštěstí) ani nebudou. EF 6 podporuje kromě přístupu Code First i práci s vizuálními modely (EDMX) - Database First (+ update from DB) a Model First. Najdeme v něm také podporu tří druhů dědičnosti (TPT, TPC, TPH), přičemž každý druh umožňuje perzistovat data jiným způsobem. EF 6 také podporuje spatial data, mapování uložených procedur na CRUD, mapování M:N bez vazební tabulky v doménovém modelu aplikace nebo jednoduché logování a zobrazení SQL dotazů s extension metodou ToString() nad IQueryable.

Jak je vidět, mnoho chybějících funkcí z EF 6 se točí kolem oblastí, které byly v minulosti relativně problematické. Vizuální modely vždy působily potíže v týmovém vývoji, nehledě na jejich praktičnost v případě velkých modelů. Dědičnost zpravidla vývojářům dala příležitost zadělat si na výkonnostní potíže a o praktičnosti uložených procedur pro CRUD asi nemá smysl se rozepisovat.

Code First

Poslední roky se v podstatě prosadil způsob vývoje Code First. Z dnešního pohledu už je název trochu legacy, protože Code First je (a vždy byl) defacto použitelný i při týmovém setupu Database First bez vizuálního modelovátka. Každopádně v EF Core 2.1 se stal Code First jediným podporovaným přístupem, byl kolem něj udělán dobrý scaffolding (generování kódu z existujícího db modelu) a vylepšena byla i práce s migracemi, čímž konečně došlo k eliminaci konfliktů migrací v týmovém prostředí. Z hlediska nastavení modelu a mapování je doporučené použití Fluent API oproti atributům (Data Annotations), které zdaleka nepokrývají všechny možnosti mapování a konfigurace jako Fluent API.

Co zvolit pro nové aplikace?

Myslím, že v případě nových aplikacích pro EF Core 2.1 nastal prime time a vývojářské týmy jej mohou zvažovat jako první volbu. Vždy je potřeba brát ohled na to, v jakém druhu aplikací bude ORM použit a jaké specifické požadavky na ORM budou kladeny. V případě běžných setupů je .NET Core 2.1 dobrá volba s řadou drobných inovací, pěkným mapováním a jasnou budoucností.

EF 6 najde uplatnění tam, kde EF Core 2.1 funkčně nestačí, nemá podporu potřebného databázového providera a nebo ve vývojářských týmech, které preferují přístupy "první generace" (Database First a Model First).

Má smysl přechod z EF 6 na EF Core 2.1?

Domnívám se, že pro mnoho projektů přechod z EF 6 na EF Core zatím smysl nemá. EF 6 bude ještě dlouhou dobu podporován, počítá se s ním i v EF Core 3.0 zalockovaným na Win a dost možná se některé funkce z EF Core 2.1 dostanou i zpětně do EF 6.

Přechod doporučuji pro malé nebo začínající projekty s jednodušším modelem, pro případy kde se najde využití pro nové funkce v EF Core 2.1 a samozřejmě pro technologické nadšence, kteří si nenechají ujít žádnou výzvu.

Složitost přechodu z EF 6 na EF Core 2.1 se do určité míry odvíjí od způsobu, jak je aplikace napsaná. I když to je práce spíše na hodiny a bude spočívat v:

  • přepsaní některých mapování (změna názvu extension metod)
  • upřesnění určitých vazeb a drobná nastavení
  • změně namespaců
  • úpravě konfigurace db kontextu
  • vyřešení migrací (likvidace)
  • změnách mapování M:N (doplnění vazebních tříd)

a dalších drobnostech. U některých modelů vyjde dost možná výhodněji scaffolding databáze a následné vyčištění generovaného kódu, než ruční upgrade.

Pokud jste s projektem na začátku jeho dlouholetého života, rozhodně bude příjemnější provést migraci nyní, než ji odkládat do budoucna. Koneckonců vyzkoušet si lze všechno nanečisto.

Update v rámci uvolnění EF Core 3.1

Nová verze EF Core 3.1 přinesla velké množství vylepšení, efektivnější generování dotazů proti cílovému úložišti, vypnutí nebezpečné client evaluation a podporu řady nových funkcí v mapování modelu.. Zlepšuje se funkcionalita odesílání RAW SQL dotazů a jejich mapování na tzv. keyless entity types. Máme podporu pro reverse engineering db views. Novou verzi EF Core 3.1 tak mohu vřele doporučit pro širší použití na webových i newebových typech projektů. V případě použití tradičního .NET Frameworku však nedoporučuji používat EF Core s výhledem do budoucna, jelikož nové verze EF Core 5 již nebudou podporovat NET Standard 2.0 (a tudíž nebudou dostupné pro tradiční .NET Framework).