Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
In vorherigen Beiträgen haben wir gezeigt, wie Sie Fenster und Steuerelemente wie das DataGrid mit den Daten aus einem ADO.NET-DataSet füllen können. Wenn Sie echte mehrschichtige Anwendungen bauen möchten, gehen Sie einen Schritt weiter und nutzen einen objektrelationalen Mapper, um die Daten aus den Tabellen in Objekten abzulegen, bevor Sie diese als Datenquelle für die Benutzeroberfläche nutzen. Der Clou eines solchen Mappers ist, dass es sich um ein Framework handelt – das heißt, dass Sie nur einen geringen Teil des notwendigen Codes selbst schreiben müssen. Dieser Artikel gibt eine kleine Einführung in das Entity Framework.
Datenzugriff gestern und heute
Unter Access waren Sie es gewohnt, direkt auf die Tabellen und Abfragen der Datenbank zuzugreifen und diese beispielsweise als Datenherkunft eines Formulars oder als Datensatzherkunft von Kombinations- und Listenfeldern anzugeben. Unter VBA konnten Sie leicht mit den Methoden des Database-Objekts der DAO-Bibliothek wie OpenRecordset, Execute et cetera per Code auf die Daten zugreifen.
In einigen Artikeln des vorliegenden Magazins haben wir gezeigt, wie Sie per ADO.NET auf die Daten einer Datenbank zugreifen und wie Sie die dort verwendeten DataSet- und DataTable-Objekte nutzen, um die enthaltenen Daten in Fenstern und ihren Steuerelementen anzuzeigen.
Damit haben wir allerdings immer noch eine recht direkte Bindung zu den Daten der Datenbank hergestellt. Das Ziel moderner Programmiersprachen ist es jedoch, die Daten in Form von Objekten zur Verfügung zu stellen, um diese in Benutzeroberflächen etwa auf Basis von WPF (Windows Presentation Foundation) anzuzeigen und bearbeiten zu können.
Mit der Kenntnis der ADO.NET-Technologie und der Grundlagen der Objektorientierung kann man dann eine Menge Code produzieren, die dafür sorgt, dass der Inhalt etwa eines Datensatzes einer Tabelle namens tblKunden in ein Objekt auf Basis einer Klasse namens clsKunde landet. Diese stellt dann über Eigenschaften wie Vorname, Nachname, Strasse und so weiter alle Informationen zur Verfügung, die im entsprechenden Datensatz der Tabelle tblKunden gespeichert sind. Die Eigenschaften dieses Objekts können Sie nun den Steuerelementen eines Fensters zuweisen, damit der Benutzer diese ansehen und bearbeiten kann. Hat der Benutzer Änderungen an diesem Datensatz durchgeführt, sollen diese natürlich in die zugrunde liegende Datenbank übertragen werden. Dazu müssen Sie den Klassen, auf denen die Objekte basieren, entsprechende Methoden hinzufügen, die sich um das Speichern der Änderungen in die Tabellen der Datenbank kümmern.
Der benötigte Code ist kein Hexenwerk, allerdings wird es schnell recht umfangreich. Je mehr Tabellen die Datenbank enthält, desto mehr Klassen sind zu definieren, und da es meist auch noch Beziehungen zwischen den einzelnen Tabellen gibt, sind diese natürlich auch entsprechend abzubilden.
Damit Sie diesen Aufwand nicht stemmen müssen, gibt es objektrelationale Mapper wie beispielsweise das Entity Framework. Damit nimmt Ihnen Microsoft zwei wichtige Aufgaben ab: Erstens erlaubt es, auf Basis einer vorhandenen Datenbank die benötigten Klassen zu erstellen, zweitens stellt es auch noch den Code zur Verfügung, mit dem die Daten von den Tabellen in die Objekte und umgekehrt übertragen werden.
Schichtweise
Im Entity Framework spricht man von verschiedenen Schichten:
- Konzeptionelle Schicht: Diese Schicht entspricht den einzelnen Geschäftsobjekten der Anwendung, die in Form etwa von einzelnen Klassen/Entitäten und ihren Beziehungen untereinander erscheint. Entitäten und Beziehungen werden in der sogenannten Conceptual Schema Definition Language (CSDL) beschrieben.
- Logische Schicht: Die logische Schicht entspricht dem Datenmodell der Datenbank. Allerdings gibt es dafür eine eigene Sprache namens Store Schema Definition Language (SSDL). Die SSDL-Dateien enthalten die Beschreibung der Tabellen, Felder, Schlüssel, Abfragen, gespeicherten Prozeduren et cetera, allerdings in einem vom Datenbanksystem unabhängigen Format.
- Zuordnungsschicht: Damit fehlt noch das Bindeglied zwischen den beiden, nämlich die Zuordnungsschicht. Diese wird in der Sprache Mapping Schema Language (MSL) verfasst. Diese Schicht legt die Zuordnung zwischen der konzeptionellen Schicht und der logischen Schicht fest, und zwar wieder im XML-Format.
Von A nach B und wieder zurück
Genau genommen bietet das Entity Framework mehrere Möglichkeiten, um die Daten zu den drei Schichten zu erstellen.
Dabei kommt es darauf an, welche Voraussetzungen vorliegen:
- Database First: Es liegt eine Datenbank vor, auf deren Basis die drei Schichten erzeugt werden sollen. Dann besteht eine weitere Voraussetzung darin, dass es einen entsprechenden Datenprovider gibt. Dies ist beispielsweise für SQL Server-Datenbanken der Fall, für Access-Datenbanken nicht.
- Model First: Hier verwenden Sie den Entity Data Model-Designer von Visual Studio, um die Entitäten und ihre Beziehungen untereinander zu definieren. Anschließend erzeugen Sie auf dieser Basis die Datenbank beziehungsweise ein entsprechendes Skript.
- Code First: Hier erstellen Sie einfach die Klassen für die einzelnen Entitäten und legen dort die Eigenschaften und Beziehungen fest. Außerdem benötigen Sie eine weitere Klasse, mit der Sie ein paar zusätzliche Informationen angeben. Auf dieser Basis erzeugt Visual Studio dann die verschiedenen Schichten des Entity Data Models und erstellt sogar noch die Datenbank.
Für uns ist zunächst die erste Variante interessant, bei der wir das Entity Data Model auf Basis einer bestehenden Datenbank erstellen. Dazu schauen wir uns auf den folgenden Seiten ein einführendes Beispiel an.
Voraussetzungen
Voraussetzung für die hier verwendete Vorgehensweise ist Visual Studio 2015 mit Update 2. Ohne Update 2 kam es bei unseren Experimenten teilweise zu Abstürzen beim Hinzufügen einer Datenquelle auf Basis eines Objekts.
Erstellen der Anwendung
Für das Beispiel verwenden wir eine Anwendung auf Basis der Vorlage Visual C#|WPF-Anwendung, die Sie mit dem Dialog erstellen können, der beim Anklicken des Menüpunkts Datei|Neu erscheint. Unser Projekt soll EntityBeispiel heißen.
Entity Framework-Unterstützung hinzufügen
Das Entity Framework besteht aus einer Reihe von zusätzlichen Elementen, die Sie Ihrer Anwendung hinzufügen müssen. Um dies zu erledigen, klicken Sie mit der rechten Maustaste auf den Namen des Projekts im Projektmappen-Explorer und wählen dort den Eintrag NuGet-Pakete verwalten… aus. Es erscheint der NuGet-Paket-Manager, in dem Sie zunächst zum Bereich Durchsuchen wechseln. Dort sollte gleich als erster Eintrag das EntityFramework auftauchen, das Sie auswählen und mit einem Mausklick auf die Schaltfläche Installieren auf der rechten Seite installieren (siehe Bild 1).
Bild 1: Hinzufügen des Entity Frameworks
Es erscheint ein weiterer Dialog, der den folgenden Vorgang einleitet und mit OK bestätigt werden kann (siehe Bild 2). Nachdem Sie auch noch die Lizenzbedingungen bestätigt haben, installiert Visual Studio das Paket im aktuellen Projekt.
Bild 2: Installation des Entity Frameworks
Datenbank erstellen
Für den Fall, dass Sie aktuell keine SQL Server-Datenbank parat haben, die Sie als Quelle für das Beispiel nutzen können, erstellen wir schnell eine – unabhängig davon, ob Sie überhaupt SQL Server installiert haben oder nicht.
Visual Studio kommt seit der Version 2012 mit einer kleinen, für Entwickler-Zwecke geeigneten und weitgehend mit dem SQL Server kompatiblen Datenbank-Engine namens LocalDB. Um diese zu nutzen, aktivieren Sie mit Ansicht|Server-Explorer den Server-Explorer, klicken mit der rechten Maustaste auf den Eintrag Datenverbindungen und wählen den Kontextmenü-Eintrag Verbindung hinzufügen… aus (siehe Bild 3).