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.
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.
Pokud zvažujete použití EF Core na nových projektech, doporučuji zajít na mé školení, kde si prakticky vyzkoušíme myšlení v ORM, navrhneme kompletní model eshopu a vyzkoušíme si dotazování a práci s daty nad připraveným modelem. Chybět nebude ani integrace do nových moderních ASP.NET Core aplikací. Informace o školení naleznete pod tímto odkazem.