1. Inleiding
1.1. Objectif
De PDF van het document is beschikbaar |HIER|.
De voorbeelden uit het document zijn beschikbaar |HIER|.
Entity Framework is een ORM (Object Relational Mapper) die oorspronkelijk door Microsoft is ontwikkeld en nu als open source [juillet 2012, http://entityframework.codeplex.com/] beschikbaar is. In een cursus ASP.NET gebruik ik de volgende architectuur voor een bepaalde webapplicatie:
![]() |
Het framework NHibernate [http://sourceforge.net/projects/nhibernate/] is een ORM dat al vóór Entity Framework op de markt kwam. Het is een volwassen product waarmee verbinding kan worden gemaakt met diverse databases. Het ORM scheidt de [DAO]-laag (Data Access Objects) van de ADO.NET-connector. Het is de ORM die de SQL-opdrachten naar de connector verstuurt. De [DAO]-laag maakt op haar beurt gebruik van de interface die door de ORM wordt aangeboden. Deze is afhankelijk van de ORM. Het wijzigen van de ORM houdt dus in dat de laag [DAO] moet worden gewijzigd.
Deze architectuur is goed bestand tegen wijzigingen in SGBD.
Wanneer de laag [DAO] rechtstreeks wordt gekoppeld aan de connector ADO.NET, heeft het wijzigen van SGBD gevolgen voor de laag [DAO]:
- de SGBD-lagen hebben niet allemaal dezelfde gegevenstypen;
- de SGBD hebben niet dezelfde strategieën voor het genereren van primaire sleutels;
- de SGBD bevatten eigen SQL;
- de laag [DAO] heeft mogelijk bibliotheken gebruikt die gekoppeld zijn aan een specifieke SGBD;
- ...
Wanneer een ORM is gekoppeld aan de connector ADO.NET, komt het wijzigen van SGBD neer op het aanpassen van de configuratie van ORM aan de nieuwe SGBD. De laag [DAO] verandert niet.
Het framework Spring.NET [http://www.springframework.net/index.html] zorgt voor de integratie van de lagen van een applicatie. Hierboven:
- vraagt de applicatie ASP.NET aan Spring om een verwijzing naar de laag [DAO];
- Spring gebruikt een configuratiebestand om deze laag aan te maken en de verwijzing ernaar terug te geven.
Deze architectuur is goed bestand tegen wijzigingen in de lagen, zolang deze dezelfde interface behouden. Het wijzigen van de bovenstaande laag [DAO] houdt in dat het configuratiebestand van Spring wordt aangepast, zodat de nieuwe laag in plaats van de oude wordt geïnstantieerd. Aangezien beide lagen dezelfde interface implementeren en de laag ASP.NET deze interface gebruikt, blijft de laag ASP.NET ongewijzigd.
We hebben hier dus te maken met een flexibele en schaalbare architectuur. Om dit te illustreren, gaan we de ORM NHibernate vervangen door Entity Framework 5:
![]() |
We gaan in verschillende stappen te werk:
- we gaan Entity Framework 5 verkennen aan de hand van verschillende SGBD;
- we bouwen de laag [DAO2];
- we koppelen de bestaande applicatie ASP.NET aan deze nieuwe laag [DAO].
1.2. Gebruikte tools
De tests zijn uitgevoerd op een laptop HP EliteBook met Windows 7 Pro, een Intel Core i7-processor en 8 GB RAM. We gebruiken C# als ontwikkeltaal.
In dit document worden de volgende hulpmiddelen gebruikt, die allemaal gratis beschikbaar zijn:
Ontwikkeltools:
- Visual Studio Express voor Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
- Visual Studio Express voor het web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].
De SGBD SQL Server Express 2012:
- de SGBD: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
- een beheertool: EMS SQL Manager voor SQL Server Freeware [http://www.sqlmanager.net/fr/products/mssql/manager/download].
De SGBD Oracle Database Express Edition 11g Release 2:
- de SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
- een beheertool: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
- een Oracle-client voor .NET: ODAC 11.2 Release 5 (11.2.0.3.20) met Oracle Developer Tools voor Visual Studio: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].
De SGBD MySQL 5.5.28:
- de SGBD: [http://dev.mysql.com/downloads/];
- een beheertool: EMS, SQL Manager voor MySQL, freeware [http://www.sqlmanager.net/fr/products/mysql/manager/download].
De SGBD PostgreSQL 9.2.1:
- de SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
- een beheertool: EMS SQL Manager voor PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].
De SGBD Firebird 2.1:
- de SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/];
- een beheertool: EMS SQL Manager voor InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].
LINQPad 4: een leermiddel voor LINQ (Language INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].
1.3. De broncodes
De broncodes van de volgende voorbeelden zijn beschikbaar op URL [http://tahe.developpez.com/dotnet/ef5cf].
![]() |
Dit zijn Visual Studio 2012-projecten [1], gebundeld in één oplossing [2]. In een map [databases] vind je een map per gebruikt SGBD. Daarin bevinden zich de scripts SQL voor het genereren van de voorbeelddatabase voor deze SGBD.
1.4. De methode
Om Entity Framework 5 Code First te leren kennen, ben ik eerst uitgegaan van het volgende boek: "Professional ASP.NET MVC 3" van Jon Galloway, Phil Haack, Brad Wilson en Scott Allen, uitgegeven door Wrox. In de voorbeeldtoepassing van dit boek gebruiken de auteurs Entity Framework (EF) als ORM. Omdat ik er nog niets van af wist, heb ik op internet gezocht om er meer over te weten te komen. Zo ontdekte ik dat de meest recente versie EF 5 was en dat er incompatibiliteiten waren met EF 4, omdat de code uit het boek, getest met EF 5, compilatiefouten vertoonde.
Vervolgens ontdekte ik dat er verschillende manieren zijn om EF te gebruiken:
- Model First: er zijn talrijke artikelen over deze benadering van EF, bijvoorbeeld [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Dit artikel begint als volgt:
Samenvatting: In dit artikel bekijken we het nieuwe Entity Framework 4 dat wordt meegeleverd met .NET Framework 4 en Visual Studio 2010. Ik zal bespreken hoe je het gebruik ervan kunt benaderen vanuit een model-first-perspectief, met als uitgangspunt dat je het databaseontwerp kunt sturen vanuit een model en zowel je database als je gegevenslaag declaratief kunt opbouwen op basis van dit model. Het model bevat de beschrijving van je gegevens, weergegeven als entiteiten en relaties, en biedt zo een krachtige manier om met ADO.NET te werken, waarbij een scheiding van verantwoordelijkheden wordt gecreëerd door middel van een abstractie tussen een modeldefinitie en de implementatie ervan.
Een ORM vormt de brug tussen databasetabellen en klassen.
![]() |
Hierboven,
- links van de laag EF5, hebben we objecten, die we entiteiten noemen;
- rechts van de laag EF5 bevinden zich databasetabellen.
![]() |
De laag [DAO] werkt met afbeeldingsobjecten uit de databasetabellen. Deze objecten worden gebundeld in een persistentiecontext en worden entiteiten (Entity) genoemd. Wijzigingen die aan entiteiten worden aangebracht, worden via de laag ORM doorgevoerd in de databasetabellen (invoegen, wijzigen, verwijderen). Bovendien beschikt de laag [DAO] over een querytaal, LINQ to Entity (Language INtegrated Query), waarmee query's op entiteiten worden uitgevoerd in plaats van op tabellen. De Model First-methode houdt in dat de entiteiten met een grafische tool worden opgebouwd. Men definieert elke entiteit en de relaties die deze met andere entiteiten verbinden. Zodra dit is gebeurd, kan met behulp van een tool het volgende worden gegenereerd:
- de verschillende klassen die de grafisch opgebouwde entiteiten weerspiegelen;
- de DDL (Data Definition Language) waarmee de database kan worden gegenereerd.
De voorbeelden die ik over deze methode heb gevonden, maakten allemaal gebruik van Visual Studio 2010 Professional en een model met de naam ADO.NET Entity Data Model. Ik heb dit model kunnen testen met Visual Studio 2010 Professional, maar toen ik overstapte naar Visual Studio Express 2012 – mijn beoogde doel – merkte ik dat dit model niet meer beschikbaar was. Daarom heb ik deze aanpak laten varen.
- Database First: het uitgangspunt van deze methode is een bestaande database. Van daaruit genereert een tool automatisch de entiteiten op basis van de tabellen in de database. Ook hier maken de gevonden voorbeelden, zoals [http://msdn.microsoft.com/en-us/data/gg685489.aspx], gebruik van Visual Studio 2010 Professional en het model ADO.NET Entity Data Model. Ik heb deze aanpak, die nochtans mijn voorkeur genoot, dus ook laten varen. Om te weten welke entiteiten als afbeeldingen van een bestaande database moesten worden gebruikt, was het eenvoudig om te beginnen met een tool die deze genereert.
- Code First: je schrijft zelf de klassen die de entiteiten zullen vormen. Je moet dan wel een minimum aan kennis hebben over de werking van EF. Dit is de weg die ik heb gevolgd, omdat deze bruikbaar was met Visual Studio Express 2012.
Toen ik dat onder de knie had, ging ik als volgt te werk:
- ik schreef code voor SQL Server Express 2012, omdat er voor deze versie de meeste voorbeelden te vinden zijn;
- zodra deze code was gedebugd, paste ik hem toe op de andere SGBD-versies (Firebird, Oracle, MySQL, PostgreSQL).
Hier gaan we het anders aanpakken. Ik zal eerst alle codes voor SQL Server beschrijven en vervolgens de porting ervan naar de andere SGBD-bestanden. Bij deze porting worden de volgende aanpassingen doorgevoerd:
- de databases hebben eigen specifieke kenmerken. Ik heb met name triggers gebruikt om de inhoud van bepaalde kolommen automatisch te genereren. Elke SGBD heeft zijn eigen manier om dit te beheren;
- de afbeeldingsentiteiten in de tabellen kunnen veranderen, maar dat is dan wel bewust gedaan. Ik had ook entiteiten kunnen kiezen die voor alle databases geschikt zijn;
- de driver ADO.NET van de SGBD verandert;
- De verbindingsketen naar SGBD verandert.
De gevolgde werkwijze is als volgt:
- koppeling van entiteiten aan de database. Het vullen van de database;
- dump van de database met LINQ-query's;
- LINQPad, een leermiddel voor LINQ;
- entiteiten toevoegen, verwijderen en wijzigen;
- beheer van gelijktijdige toegang;
- persistentiecontext opgeslagen in een transactie;
- wijziging van een entiteit buiten de persistentiecontext;
- Eager en Lazy loading;
- opbouw van de laag [DAO];
- opbouw van de weblaag ASP.NET.
1.5. Doelgroep
Dit document is bedoeld voor beginners.
Dit document is geen cursus over Entity Framework 5 Code First. Hiervoor kan men bijvoorbeeld het boek "Programming Entity Framework: Code First" van Julie Lerman en Rowan Miller, uitgegeven door O'Reilly, raadplegen. Het document pretendeert geenszins volledig te zijn, maar beschrijft eenvoudigweg de aanpak die ik heb gebruikt om deze ORM te begrijpen. Ik denk dat deze aanpak ook nuttig kan zijn voor anderen die aan de slag gaan met EF5. Mijn doel reikt niet verder dan dit.
1.6. Gerelateerde artikelen over developpez.com
Het hierboven genoemde boek zal als referentie dienen. Daarnaast zijn er artikelen gewijd aan Entity Framework op developpez.com. Hier volgen er enkele:
- "Entity Framework – de Code First-aanpak", juni 2012 – door Reward. Dit artikel en dit document overlappen elkaar gedeeltelijk. Het gaat echter op bepaalde punten verder, met name wat betreft de "mapping" van klasse-erfenis <--> tabellen;
- "Inleiding tot Entity Framework", december 2008, door Paul Musso;
- "Een klassenmodel maken met Entity Framework", april 2009, door Jérôme Lambert;
- "Prestatiemeting van Linq to SQL ten opzichte van Sql en Entity Framework", juni 2011, door Immobilis;
- "Entity Framework Code First: automatische migratie inschakelen", juni 2012, door Hinault Romaric;
- "Een CRUD-toepassing maken met WebMatrix, Razor en Entity Framework", mei 2012, door Hinault Romaric;
- "Entity Framework: een kennismaking met Code First-migraties", juni 2012, door Hinault Romaric;
Zoals hierboven vermeld, is dit document niet volledig. Het is de moeite waard om de bovenstaande artikelen te lezen om bepaalde hiaten op te vullen. Mijn onderzoek is mogelijk onvolledig. Mijn excuses aan de auteurs die ik mogelijk over het hoofd heb gezien.




