Skip to content

1. Einführung

1.1. Objectif

Das PDF des Dokuments ist verfügbar |HIER|.

Die Beispiele des Dokuments sind verfügbar |HIER|.

Entity Framework ist ein ORM (Object Relational Mapper), der ursprünglich von Microsoft entwickelt wurde und nun als Open-Source-Software [juillet 2012, http://entityframework.codeplex.com/] verfügbar ist. In einem Kurs ASP.NET verwende ich die folgende Architektur für eine bestimmte Webanwendung:

Das Framework NHibernate [http://sourceforge.net/projects/nhibernate/] ist ein ORM, das bereits vor dem Entity Framework auf den Markt kam. Es handelt sich um ein ausgereiftes Produkt, das die Anbindung an verschiedene Datenbanken ermöglicht. Das ORM isoliert die Schicht [DAO] (Data Access Objects) vom Konnektor ADO.NET. Es ist das ORM, das die Befehle SQL an den Konnektor sendet. Die Schicht [DAO] nutzt ihrerseits die vom ORM bereitgestellte Schnittstelle. Diese hängt vom ORM ab. Ein Wechsel des ORM hat daher zur Folge, dass auch die Schicht [DAO] geändert werden muss.

Diese Architektur ist gegenüber Änderungen an SGBD sehr widerstandsfähig.

Wenn die Schicht [DAO] direkt mit dem Konnektor ADO.NET verbunden wird, wirkt sich eine Änderung an SGBD auf die Schicht [DAO] aus:

  • Die SGBD haben nicht alle denselben Datentyp;
  • die SGBD haben nicht dieselben Strategien zur Generierung der Primärschlüssel;
  • die SGBD enthalten proprietäre SQL;
  • die Schicht [DAO] hat möglicherweise Bibliotheken verwendet, die mit einem bestimmten SGBD verknüpft sind;
  • ...

Wenn ein ORM mit dem Konnektor ADO.NET verbunden ist, bedeutet ein Wechsel von SGBD, dass die Konfiguration von ORM an das neue SGBD angepasst wird. Die Schicht [DAO] bleibt unverändert.

Das Framework Spring.NET [http://www.springframework.net/index.html] sorgt für die Integration der Schichten einer Anwendung. Oben:

  • fordert die Anwendung ASP.NET von Spring eine Referenz auf die Schicht [DAO] an;
  • Spring nutzt eine Konfigurationsdatei, um diese Schicht zu erstellen und die Referenz darauf zurückzugeben.

Diese Architektur ist gegenüber Änderungen an den Schichten sehr widerstandsfähig, solange diese stets dieselbe Schnittstelle aufweisen. Um die oben genannte Schicht [DAO] zu ändern, muss lediglich die Spring-Konfigurationsdatei angepasst werden, damit die neue Schicht anstelle der alten instanziiert wird. Da diese die gleiche Schnittstelle implementieren und die Schicht ASP.NET diese Schnittstelle nutzt, bleibt die Schicht ASP.NET unverändert.

Wir haben es hier also mit einer flexiblen und skalierbaren Architektur zu tun. Um dies zu veranschaulichen, werden wir die Schicht ORM durch Entity Framework 5 ersetzen:

Wir werden in mehreren Schritten vorgehen:

  • Zunächst werden wir Entity Framework 5 anhand mehrerer SGBD-Dateien kennenlernen;
  • wir werden die Schicht [DAO2] aufbauen;
  • wir werden die bestehende Anwendung ASP.NET mit dieser neuen Schicht [DAO] verbinden.

1.2. Verwendete Tools

Die Tests wurden auf einem Laptop HP EliteBook mit Windows 7 Pro, einem Intel Core i7-Prozessor und 8 GB RAM durchgeführt. Als Entwicklungssprache verwenden wir C#.

In diesem Dokument werden die folgenden Tools verwendet, die alle kostenlos verfügbar sind:

Entwicklungswerkzeuge:

  • Visual Studio Express für den Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
  • Visual Studio Express für das Web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].

SGBD SQL Server Express 2012:

  • SGBD: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
  • ein Verwaltungstool: EMS, SQL Manager für SQL Server Freeware [http://www.sqlmanager.net/fr/products/mssql/manager/download].

SGBD Oracle Database Express Edition 11g Release 2:

  • SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
  • ein Verwaltungstool: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
  • ein Oracle-Client für .NET: ODAC 11.2 Release 5 (11.2.0.3.20) mit Oracle Developer Tools für Visual Studio: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].

SGBD MySQL 5.5.28:

  • SGBD: [http://dev.mysql.com/downloads/];
  • ein Verwaltungstool: EMS, SQL, Manager für MySQL, Freeware [http://www.sqlmanager.net/fr/products/mysql/manager/download].

Das SGBD PostgreSQL 9.2.1:

  • SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
  • ein Verwaltungstool: EMS SQL Manager für PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].

SGBD Firebird 2.1:

  • SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/];
  • ein Verwaltungstool: EMS SQL Manager für InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].

LINQPad 4: Ein Lernprogramm für LINQ (Sprache INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. Die Quellcodes

Die Quellcodes der folgenden Beispiele sind unter URL und [HIER] verfügbar.

Es handelt sich um Visual Studio 2012-Projekte ([1]), die in einer Lösung ([2]) zusammengefasst sind. In einem Ordner [databases] befindet sich für jedes verwendete SGBD ein eigener Ordner. Darin befinden sich die Skripte SQL zur Erstellung der Beispieldatenbank für diese SGBD.

1.4. Die Vorgehensweise

Um mich mit Entity Framework 5 Code First vertraut zu machen, habe ich zunächst das folgende Buch herangezogen: „Professional ASP.NET MVC 3“ von Jon Galloway, Phil Haack, Brad Wilson und Scott Allen, erschienen bei Wrox. In der Beispielanwendung dieses Buches verwenden die Autoren Entity Framework (EF) als ORM. Da ich mich damit nicht auskannte, habe ich im Internet recherchiert, um mehr darüber zu erfahren. Dabei habe ich festgestellt, dass die aktuellste Version EF 5 ist und dass es Inkompatibilitäten mit EF 4 gibt, da der im Buch beschriebene Code beim Testen mit EF 5 Kompilierungsfehler aufwies.

Anschließend habe ich herausgefunden, dass es mehrere Möglichkeiten gibt, EF zu verwenden:

  • Model First: Es gibt zahlreiche Artikel zu diesem Ansatz von EF, zum Beispiel [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Dieser Artikel beginnt wie folgt:

Zusammenfassung: In diesem Beitrag befassen wir uns mit dem neuen Entity Framework 4, das im Lieferumfang von .NET Framework 4 und Visual Studio 2010 enthalten ist. Ich werde erläutern, wie Sie die Verwendung aus einer „Model-First“-Perspektive angehen können, wobei die Prämisse gilt, dass Sie das Datenbankdesign anhand eines Modells steuern und sowohl Ihre Datenbank als auch Ihre Datenzugriffsschicht deklarativ auf der Grundlage dieses Modells erstellen können. Das Modell enthält die Beschreibung Ihrer Daten, dargestellt als Entitäten und Beziehungen, und bietet damit einen leistungsstarken Ansatz für die Arbeit mit ADO.NET, indem es durch eine Abstraktion zwischen der Modelldefinition und ihrer Implementierung eine Trennung der Anliegen ermöglicht.

Ein ORM bildet die Brücke zwischen Datenbanktabellen und Klassen.

Oben,

  • links von der Schicht EF5 befinden sich Objekte, die als Entitäten bezeichnet werden;
  • rechts von der Schicht EF5 befinden sich Datenbanktabellen.

Die Ebene [DAO] arbeitet mit Bildobjekten aus den Datenbanktabellen. Diese Objekte werden in einem Persistenzkontext zusammengefasst und als Entitäten (Entity) bezeichnet. Änderungen an den Entitäten werden über die Schicht ORM in die Datenbanktabellen übernommen (Einfügen, Ändern, Löschen). Darüber hinaus verfügt die Schicht [DAO] über eine Abfragesprache namens „LINQ to Entity“ (Language INtegrated Query), die Abfragen auf Entitäten und nicht auf Tabellen durchführt. Bei der „Model-First“-Methode werden die Entitäten mit einem grafischen Tool erstellt. Man definiert jede Entität und die Beziehungen, die sie mit anderen verbinden. Anschließend ermöglicht ein Tool die Generierung:

  • die verschiedenen Klassen, die die grafisch erstellten Entitäten widerspiegeln;
  • die DDL (Data Definition Language), mit der die Datenbank generiert werden kann.

Die Beispiele, die ich zu dieser Methode gefunden habe, verwendeten alle Visual Studio 2010 Professional und ein Modell namens „ADO.NET Entity Data Model“. Ich konnte dieses Modell mit Visual Studio 2010 Professional testen, doch als ich zu Visual Studio Express 2012 wechselte, das mein Ziel war, stellte ich fest, dass dieses Modell nicht mehr verfügbar war. Daher habe ich diesen Ansatz aufgegeben.

  • „Database First“: Ausgangspunkt dieser Methode ist eine bestehende Datenbank. Auf dieser Grundlage generiert ein Tool automatisch die Entitätsmodelle der Datenbanktabellen. Auch hier verwenden die gefundenen Beispiele, zum Beispiel „[http://msdn.microsoft.com/en-us/data/gg685489.aspx]“, Visual Studio 2010 Professional und das Modell „ADO.NET Entity Data Model“. Daher habe ich auch diesen Ansatz aufgegeben, obwohl er eigentlich mein Favorit war. Um herauszufinden, welche Entitäten als Abbilder einer bestehenden Datenbank verwendet werden sollten, war es einfach, mit einem Tool zu beginnen, das diese generiert.
  • Code First: Man schreibt selbst die Klassen, aus denen die Entitäten bestehen sollen. Dazu muss man über ein Mindestmaß an Kenntnissen über die Funktionsweise von EF verfügen. Diesen Weg habe ich eingeschlagen, da er mit Visual Studio Express 2012 umsetzbar war.

Nachdem ich das verstanden hatte, ging ich wie folgt vor:

  • Ich habe Code für SQL Server Express 2012 geschrieben, da es für diese Version die meisten Beispiele gibt;
  • sobald dieser Code debuggt war, habe ich ihn auf die anderen SGBD-Versionen (Firebird, Oracle, MySQL, PostgreSQL) portiert.

Hier werden wir anders vorgehen. Zunächst werde ich den gesamten Code für den SQL-Server beschreiben und anschließend die Portierung auf die anderen SGBD erläutern. Bei dieser Portierung werden folgende Anpassungen vorgenommen:

  • Die Datenbanken weisen proprietäre Besonderheiten auf. Ich habe insbesondere Trigger verwendet, um den Inhalt bestimmter Spalten automatisch zu generieren. Jedes SGBD hat seine eigene Art, dies zu handhaben;
  • Die Bildentitäten in den Tabellen können sich ändern, dies geschieht jedoch bewusst. Ich hätte auch Entitäten wählen können, die für alle Datenbanken geeignet sind;
  • der Treiber ADO.NET des SGBD ändert sich;
  • Die Verbindungszeichenfolge zum SGBD ändert sich.

Es wird wie folgt vorgegangen:

  • Zuordnung von Entitäten zur Datenbank. Befüllung der Datenbank;
  • Datenbank-Dump mit Abfragen LINQ;
  • LINQPad, ein Lernwerkzeug für LINQ;
  • Hinzufügen, Löschen und Ändern von Entitäten;
  • Verwaltung der Zugriffskonkurrenz;
  • in einer Transaktion gespeicherter Persistenzkontext;
  • Änderung einer Entität außerhalb des Persistenzkontexts;
  • Eager- und Lazy-Loading;
  • Aufbau der Schicht [DAO];
  • Aufbau der Webschicht ASP.NET.

1.5. Zielgruppe

Die Zielgruppe sind Anfänger.

Dieses Dokument ist kein Kurs zu Entity Framework 5 Code First. Dazu kann man beispielsweise „Programming Entity Framework: Code First“ von Julie Lerman und Rowan Miller, erschienen bei O’Reilly, lesen. Das Dokument erhebt keinerlei Anspruch auf Vollständigkeit, sondern stellt lediglich die Vorgehensweise dar, die ich zum Verständnis dieses ORM verwendet habe. Ich denke, dass diese Vorgehensweise auch anderen Personen helfen kann, die sich mit EF5 beschäftigen. Mein Ziel geht nicht über diesen Rahmen hinaus.

1.6. Verwandte Artikel zu developpez.com

Das oben genannte Buch dient als Nachschlagewerk. Darüber hinaus gibt es Artikel zum Entity Framework auf developpez.com. Hier sind einige davon:

Wie oben bereits erwähnt, ist das vorliegende Dokument nicht vollständig. Es empfiehlt sich, die oben genannten Artikel zu lesen, um gewisse Lücken zu schließen. Meine Recherche ist möglicherweise unvollständig. Ich bitte die Autoren, die ich möglicherweise vergessen habe, um Entschuldigung.