Entity Framework: Datenbankinitialisierung

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.

Entity Framework: Datenbankinitialisierung

Wenn Sie mit Code First arbeiten, also Ihre Datenbank auf Basis eines Entity Data Models erstellt wird, können Sie verschiedene Strategien auswählen, um die Datenbank zu erstellen oder anzupassen, wenn Sie die Anwendung an einen anderen Benutzer weitergeben. Dieser Artikel zeigt, welche Möglichkeiten es gibt und wie diese funktionieren.

In den letzten Ausgaben von DATENBANKENTWICKLER haben wir vermehrt mit Anwendungen gearbeitet, in denen wir ein Entity Data Model definiert haben, also verschiedene Klassen für die Objekte und entsprechende Auflistungen. Daraus erstellt das Entity Framework dann bei Bedarf eine Datenbank, welche die Klassen und Auflistungen berücksichtigt. Dabei gibt es verschiedene Möglichkeiten, die Datenbank zu erstellen, wenn diese noch nicht vorhanden ist oder diese anzupassen, wenn Sie eine neue Version der Datenbank an den Benutzer weitergeben.

Als Voraussetzung wollen wir ein einfaches Modell heranziehen, dass nur aus den beiden Tabellen Articles und Categories besteht. Diese haben wir in einem neuen Projekt namens InitializationSample als Visual Basic-WPF-App angelegt, dem wir ein neues Objekt des Typs ADO.NET Entity Data Model für ein Leeres Code First-Modell namens ArticleContext hinzugefügt haben.

Hier legen wir im Unterordner Data die erste Klasse namens Articles.vb an:

Public Class Article
     Public Property ID As Integer
     Public Property Name As String
     Public Property CategoryID As Integer
     Public Property Category As Category
     Public Property Price As Decimal
End Class

Die zweite Klasse nimmt die Kategorien auf und heißt Categories.cs:

Public Class Category
     Public Property ID As Integer
     Public Property Name As String
     Public Property Articles As ICollection(Of Article)
End Class

Dazu kommen zwei Zeilen, welche die Auflistungen der Elemente dieser beiden Klassen repräsentieren. Diese fügen wir in der Klasse ein, die beim Hinzufügen des Entity Data Models angelegt wurde und den Namen ArticleContext.vb trägt. Diese sieht dann so aus:

Imports System.Data.Entity
Public Class ArticleContext
     Inherits DbContext
     Public Sub New()
         MyBase.New("name=ArticleContext")
     End Sub
     Public Property Categories() As DbSet(Of Category)
     Public Property Articles() As DbSet(Of Article)
End Class

Datenbank beim ersten Zugriff erstellen

Entity Framework hat einen Mechanismus, der dafür sorgt, dass eine Datenbank automatisch erstellt wird, wenn Sie das erste Mal auf diese zugreifen, aber noch keine Datenbank vorhanden ist. Um dies auszuprobieren, fügen Sie der Code behind-Klasse des Fensters MainWindow.xaml zunächst den Konstruktor hinzu und füllen diesen dann mit den folgenden Anweisungen:

Class MainWindow
     Public Sub New()
         Using dbContext As ArticleContext = New ArticleContext
             Dim MyCategory As Category
             MyCategory = New Category()
             MyCategory.Name = "Getränke"
             dbContext.Categories.Add(MyCategory)
             dbContext.SaveChanges()
         End Using
     End Sub
End Class

Die Methode New erstellt einen neuen Kontext auf Basis der Klasse ArticleContext und speichert diese in der Variablen dbContext. Dann erstellen wir ein neues Objekt des Typs Category, weisen der Eigenschaft Name den Wert Getränke zu und fügen das neue Objekt zur Auflistung Categories des Objekts dbContext hinzu. Die Änderungen speichern wir dann mit der Methode SaveChanges.

Nun brauchen Sie die Anwendung nur noch zu starten. Es dauert dann ein wenig länger bis zum Erscheinen des Anwendungsfensters, aber dafür wird in der Zwischenzeit auch gleich die Datenbank erstellt.

Diese finden Sie dann nach dem Beenden der Anwendung unter Visual Studio im SQL Server-Objekt-Explorer, den Sie mit dem Menübefehl Ansicht|SQL Server-Objekt-Explorer einblenden können. Hier klappen Sie den Eintrag Datenbanken auf und finden die Datenbank InitializationSample.ArticleContext vor (siehe Bild 1).

Die neue Datenbank im SQL Server-Objekt-Explorer

Bild 1: Die neue Datenbank im SQL Server-Objekt-Explorer

Wenn Sie nun noch das Kontextmenü des Eintrags dbo.Categories öffnen und dort den Befehl Daten anzeigen auswählen, erscheinen die Daten der Tabelle Categories – in diesem Fall der eine in der Konstruktor-Methode angelegte Datensatz mit dem Wert Getränke im Feld Name.

Ergebnisse beim Anlegen der Datenbank

Schauen wir uns an, was im Detail geschehen ist. Als Erstes ist festzuhalten: Es wurde eine Datenbank angelegt, und zwar auf dem Server (LocalDb)MSSQLLocalDB und unter dem Namen InitializationSample.ArticleContext.

Wenn Sie diese Einstellung ändern wollen, können Sie das in der Datei App.config (für Desktop-Anwendungen) oder Web.config (für Web-Anwendungen) erledigen, wo Sie den folgenden Abschnitt anpassen müssen:

<connectionStrings>
     <add name="ArticleContext" connectionString="data source=(LocalDb)MSSQLLocalDB;        initial catalog=InitializationSample.ArticleContext;integrated security=True;MultipleActiveResultSets=True;        App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>

Woher weiß Entity Framework, dass es genau diese Verbindungszeichenfolge nutzen soll? Wir sehen hier, dass diese den Namen ArticleContext aufweist. Dieser wird in der Konstruktor-Methode der Klasse ArticleContext.vb, die mit dem Entity Data Model erstellt wurde, referenziert:

Public Sub New()
     MyBase.New("name=ArticleContext")
End Sub

Wenn Sie also eine andere Verbindungszeichenfolge nutzen wollen, stellen Sie diese hier ein.

Alternativer Datenbankname

Während wir dem New-Konstruktor von MyBase soeben den Namen der Verbindungszeichenfolge übergeben haben, können Sie hier auch den Namen der zu erstellenden Datenbank angeben. Dazu lassen Sie einfach den Namen des Parameters weg und geben direkt den gewünschten Datenbanknamen an, zum Beispiel InitializationSample:

Public Sub New()
     MyBase.New("InitializationSample")
End Sub

Sie können aber auch einfach den Namen der Datenbank in der Verbindungszeichenfolge anpassen. Diesen finden Sie unter dem Parameternamen initial catalog.

Tabellen erstellen

Welche Tabellen Entity Framework in der neuen Datenbank erstellen soll, entnimmt es ebenfalls der Klasse ArticleContext.vb. Hier berücksichtigt es einfach alle als DbSet deklarierten öffentlichen Eigenschaften, also aktuell diese hier:

Public Property Categories() As DbSet(Of Category)
Public Property Articles() As DbSet(Of Article)

Felder hinzufügen

Nun fehlen noch die Felder. Welche Entity Framework hier hinzufügen muss, entnimmt es der Definition der Klassen, die in den DbSet-Objekten angegeben sind (zum Beispiel DbSet(Of Category)).

Wie Sie die Felder anlegen müssen, damit beispielsweise Beziehungen zwischen den Tabellen in der Zieldatenbank entstehen, erfahren Sie in den Artikeln EDM: 1:n-Beziehungen per Code First, EDM: 1:1-Beziehungen per Code First und EDM: m:n-Beziehungen per Code First.

Der nächste Start

Wenn Sie die Anwendung nun nochmals öffnen, ist die Datenbank bereits vorhanden. Entity Framework muss diese dann nicht erneut anlegen und kann die vorhandene Datenbank verwenden.

Änderungen am Datenmodell

Wenn Sie nun eine Änderung am Datenmodell vornehmen, indem Sie etwa das Feld Description zur Klasse Article hinzufügen, wollen Sie diese Änderung natürlich auch auf das Datenmodell einer eventuell bereits existierenden Datenbank übertragen. Also probieren wir aus, was nach der folgenden Anpassung und einem Neustart der Anwendung geschieht:

Public Class Article

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.