Entity Framework: Datenbankinitialisierung

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

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.

 

Schreibe einen Kommentar