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

Miroslav Holec       11.05.2018       Entity Framework, .NET       10591 zobrazení

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.


Školení Entity Framework Core

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.


 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

A co výkon?

Jak je na tom EF Core s výkonem. U "normálního" se občas na něčem zasekneme a nezbývá než přepsat do běžného SQL.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

To se nedá jednoznačně odpovědět. Záleží na tom, jaký SQL dotaz je vygenerován, kolik práce s ním má DBS, kolik dat se musí přenést po síti apod. Dotazy generované EF Core jsou často "rozumnější" než u EF. Záleží na případu.

V obecné rovině je rychlost EF Core 2.0+ je lepší než u EF 6 (běžné inserty, selecty). Dle některých měření na blogách je na tom EF Core lépe než Dapper (což bych za sebe spíše vyvrátil). Bavíme se ale o mikročasech. Největší potíže s performance tvoří obvykle "nevhodné" SQL dotazy, chybějící indexy, zbytečné roundtripy do databáze, přenos velkých dat a filtrování na klientovi, špatně navržený model DB apod.

Psaní běžných SQL dotazů se asi nikdy nezbavíme. Vždy bude mnoho případů, kdy bude lepší napsat plain SQL, než vyrábět složité dotazy v EF / EF Core. Důležité je mít ve všem pořádek, jinak se vám dříve či později SQL "rozjedou" s modelem.

Mimochodem značný výkonnostní rozdíl je i mezi samotnými verzemi EF 4/5/6.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback