.Net Core Series: EF of EF.Core?
387

.Net Core Series
Artikel 2: EF of EF.Core?

Als architect en ontwikkelaar kom je ongetwijfeld op een bepaald moment voor de keuze te staan welk platform te kiezen voor het abstraheren van het domein model. Dit blog artikel behandelt overwegingen die een rol zouden moeten spelen bij de keuze van de ORM- module van .Net (Entity Framework). Bij het lezen van dit artikel is enige kennis en ervaring vereist over het Entity Framework en ORM principes in het algemeen. Uitleg hierover is buiten beschouwing gelaten van dit artikel.

Welke overwegingen moet ik nemen voor het maken van een keuze tussen Entity Framework vs Entity Framework.Core. Het doel van dit artikel is je hierbij te helpen. Even vooraf, de volgende opmerkingen:

  • Entity Framework 6 is en blijft door Microsoft een ondersteund ORM framework voor komende jaren. Uitbreiding met nieuwe features echter kan niet worden verwacht. Microsoft zal wel blijven ontwikkelen om bugs te verhelpen en verbeteringen aan te brengen
  • Entity Framework Core 1 is een van “ground up” ontwikkeld nieuw framework. De komende jaren zal Microsoft hierop door ontwikkelen waarbij features worden toegevoegd, naast het oplossen van bugs en aanbrengen van (performance) verbeteringen

Bestaande applicaties/services:
“If its not broken, do not fix it”.
Bestaande applicaties die enkele dienstjaren hebben en voldoende in de business behoefte voorzien, behoeven per definitie niet te worden aanpast. Waarom niet? Overgang naar .Net Core is geen upgrade maar een serieuze refactoring / portering inspanning die functioneel weinig toevoegd. Sterker nog, zonder gedegen onderzoek naar de verschillen in features van beide frameworks, kan men worden verrast door het feit dat bepaalde features (nog) niet worden ondersteund in .Net Core.

“Wanneer dan wel?”.
Microsoft’s paradigma “cloud first, mobile first” bestaat nog niet lang. Veel van onze klanten hebben applicaties operationeel die ver voor de beschikbaarheid van cloud en mobiliteit waren ontwikkeld. Destijds waren dat dus geen thema’s die werden meegenomen bij ontwerpbeslissingen over architectuur en framework keuzes. Echter, het komt voor dat organisaties besluiten om “agile” te werken en delen van hun landschap mobiel aan te bieden. Op dat moment ontkomt de organisatie er niet aan, keuzes te herzien en architectuur van de oplossing opnieuw onder de loep te houden.

Nieuwe applicaties/services:
Het lijkt voor de hand te liggen voor ontwikkelteams om direct met Entity Framework Core aan de slag te gaan. Ontwikkelteams komen vaak in de verleiding om met de “latest en greatest” te ontwikkelen. Ja Entity Framework Core is een productie rijp product, echter Microsoft heeft nog een grote pool aan ontwikkelaars die features implementeren die ontbreken ten opzichte van de Entity Framework 6. Wees dus ook hier kritisch bij het maken van de keuze door goed te analyseren welke features je nodig hebt, maar nog ontbreken in Entity Framework Core. Wees bedacht echter dat deze verschillen in de tijd minder zullen worden.

Het gebruiken van Entity Framework Core is een zeer voor de hand liggende keuze indien de volgende thema’s van belang zijn:

  • De applicatie/service wordt in een cross platform omgeving uitgerold (Linux bijvoorbeeld)
  • High load en performance zijn vereist
  • De architectuur standaarden vereisen zeer hoge unit test coverage

De redenen zijn hiervoor zijn:

  • Entity Framework Core is vanaf “ground up” opnieuw gebouwd waarbij performance een kernwaarde is
  • Het framework is gebouwd op de .Net Framework Standard runtime die cross platform ingezet kan worden
  • Standaard wordt de ondersteuning geleverd voor “in memory” databases die je in staat stelt om test driven het domein model te testen met unit tests die gebruik maken van een versie van de database in het geheugen in plaats van een “echte” database

Mocht het moment daar zijn dat is gekozen voor Entity Framework Core, wees dan alsnog bedacht op de volgende “gotcha’s”:

  • Core heeft (nog) geen EDMX Designer. Je bent gebonden aan het ‘code-first’ principe of je moet een externe add-in tool aanschaffen die de leemte vult
  • Migrations zijn beschikbaar, echter nog steeds manueel via de console. Ontwikkelaars moeten handmatig snapshots van databases maken via het Migrations pattern
  • Entity Framework Core is NIET backwards compatible. De uitgebrachte versies tot dusver zijn brekend geweest ten opzichte van de vorige versie. Wees erop bedacht dat toekomstige versie(s) dit ook het geval kan zijn
  • Er is nog geen ondersteuning van complex en value types. Beschouw dit als types zonder een primary key en als container van eigenschappen
  • Stored procedure support voor entities. Het is al mogelijk om via ‘FromSql’ statement stored procedures aan te roepen. Echter, het mappen van entities naar gerichte stored procedures voor CRUD acties is nog niet mogelijk
  • Reverse engineer model from database en update model from database is beide nog niet mogelijk

De vergelijking tussen Entity Framework en Entity Framework Core wordt (hopelijk) door Microsoft op deze site actueel gehouden: https://docs.microsoft.com/en-us/ef/efcore-and-ef6/features

Auteur: Arjen Kraak, Bergler Competence Center © 2017