Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
EDM: Der Code First-Ansatz
In den bisherigen Ausgaben haben wir immer mit dem Database First-Ansatz gearbeitet, das heißt, dass wir unser Entity Data Model auf Basis einer bestehenden Datenbank im SQL Server oder SQLite generiert haben. Das geht auch andersherum: Sie erstellen ein paar Klassen, geben eine Verbindungszeichenfolge an und beim ersten Versuch, auf die Daten der Datenbank zuzugreifen, erstellt die Anwendung automatisch die Datenbank im angegebenen SQL Server. Wie das gelingt und wie die Klassen und die Verbindungszeichenfolge aussehen müssen, erfahren Sie in diesem Beitrag.
Als Beispiel wählen wir unsere Anwendung zum Erstellen von Anschreiben mit Word von einem WPF-Fenster aus. Dieser haben wir im ersten Schritt ja nur einfache Textfelder als Eingabemöglichkeit hinzugefügt, in die der Benutzer Anschrift, Datum, Betreff und Inhalt des Anschreibens eintragen kann, bevor daraus ein Word-Dokument auf Basis der gewählten Vorlage erstellt wird. Nun wollen wir dies erweitern – und zwar um die Möglichkeit, sowohl verschiedene Anschriften zu verwalten als auch um die Anschreiben abzuspeichern, um diese gegebenenfalls später noch einmal aufzurufen oder auch als Vorlage für neue Anschreiben zu verwenden.
Unter Access würden wir das Formular einfach an eine Tabelle zum Speichern der Daten des Anschreibens binden und gegebenenfalls noch eine Tabelle für die verschiedenen Anschriften hinzufügen. Allerdings wollen wir ja in diesem Magazin lernen, mit den unter WPF gängigen Techniken umzugehen – wie etwa dem Entity Data Model als Möglichkeit, Daten zwischen Benutzeroberfläche und Datenbank hin- und herzuschieben.
In den vorherigen Ausgaben haben wir meist eine vorhandene Datenbank genutzt und mit dem dafür vorgesehenen Assistenten ein Entity Data Model erstellen lassen. Dieses enthält die Klassen und Auflistungen, mit denen wir dann von der Benutzeroberfläche beziehungsweise von der Anwendungslogik aus auf die Daten der Datenbank zugreifen konnten. In diesem Beispiel wollen wir es einmal andersherum versuchen: Wir wollen zuerst die Klassen für die beiden Entitäten programmieren, also für die Anschreiben und die Adressen, und daraus dann ein Datenmodell generieren. Auch dieser Fall ist vom Entity Framework als Möglichkeit vorgesehen und nennt sich Code First. Wir erstellen also erst den Code und lassen daraus dann die Datenbank erzeugen. Das wir für das erste Beispiel eine relativ einfache Konstellation mit nur zwei Entitäten nutzen (okay, mit Anreden für die Adressen vielleicht drei), wird die Komplexität ein wenig vermindern.
Vorbereitungen
Als Erstes erstellen wir ein neues, leeres Projekt namens CodeFirst – und zwar mit der Vorlage Visual Basic|Windows|WPF-Anwendung oder Visual C#|Windows|WPF-Anwendung. Diesem Projekt fügen Sie nach Markierung des Eintrags mit dem Projektnamen CodeFirst im Projektmappen-Explorer ein Element des Typs ADO.NET Entity Data Model hinzu. Den dazu nötigen Dialog Neues Element hinzufügen... öffnen Sie mit der Tastenkombination Strg + Umschalt + A. Hier wählen Sie den passenden Elementtyp aus und legen als Name den Wert Wordgenerator fest (siehe Bild 1).
Bild 1: Entity Data Model zum Projekt hinzufügenIm folgenden Assistent für Entity Data Model wählen Sie den Eintrag Leeres Code First-Modell aus (siehe Bild 2). Im Gegensatz zu der Variante, die wir sonst gewählt haben, nämlich EF Designer aus Datenbank, ist dies gleichzeitig schon der letzte Schritt in diesem Assistenten, den wir mit einem Klick auf die Schaltfläche Fertigstellen beenden.
Bild 2: Modelltyp Leeres Code First-Modell auswählenDiesmal geschieht auch gar nicht viel in unserem Projekt. Die augenscheinlichste Änderung ist, dass der Assistent ein Klassenmodul namens Wordgenerator.vb (beziehungsweise Wordgenerator.cs unter C#) angelegt hat (siehe Bild 3). Die Klasse Wordgenerator erbt von der Klasse DbContext.
Bild 3: Durch den Assistenten angelegte KlasseModell programmieren
Nun programmieren wir die Klassen für unser Modell, auf dessen Basis wir später eine Datenbank erstellen lassen wollen.
Dazu legen wir drei neue Klassen an – jeweils wieder über die Tastenkombination Strg + Umschalt + A und den dadurch aufgerufenen Dialog Neues Element einfügen.... Hier wählen wir nun jeweils den Eintrag Klasse aus und legen die Namen Anschreiben.vb, Adresse.vb und Anrede.vb fest. Die Klasse Anrede.vb sieht wie folgt aus:
Public Class Anrede
Public Property ID As Integer
Public Property Anrede As String
End Class
Für die Klasse Adresse legen wir den folgenden Code fest, wobei wir als Typ der Eigenschaft Anrede auch gleich die frisch angelegte Klasse gleichen Namens verwenden:
Public Class Adresse
Public Property ID As Integer
Public Property Firma As String
Public Property Anrede As Anrede
Public Property Vorname As String
Public Property Nachname As String
Public Property Strasse As String
Public Property PLZ As String
Public Property Ort As String
Public Property Land As String
Public Property EMail As String
End Class
Nachdem wir die Klasse Adresse erzeugt haben, die wir auch als Collection der Klasse Anrede zuordnen wollen – jede Anrede gehört ja zu keiner, einer oder mehreren Adressen –, können wir die Klasse Anrede noch um die Auflistung Adressen mit dem Typ Adresse erweitern:
Public Class Anrede
...
Public Property Adressen As ICollection(Of Adresse)
End Class
Die Klasse Anschreiben erhält schließlich die folgenden Eigenschaften:
Public Class Anschreiben
Public Property ID As Integer
Public Property Adresse As Adresse
Public Property Datum As Date
Public Property Betreff As String
Public Property Inhalt As String
End Class
Auch hier können wir nun die Klasse Adresse um die Auflistung der Anschreiben ergänzen:
Public Class Adresse
...
Public Property Anschreiben As ICollection(Of Anschreiben)
End Class
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.