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: 1:n-Beziehungen per Code First
Im Artikel »EDM: Der Code First-Ansatz« haben wir gezeigt, wie Sie unter Nutzung des Entity Frameworks ein Datenmodell per Klassenmodell programmieren und dann mit ein paar Befehlen dafür sorgen, dass die Klassen in Form eines Datenmodells in einer Datenbank umgesetzt werden. Im vorliegenden Artikel schauen wir uns nun im Detail an, wie Sie 1:n-Beziehungen mit Code First definieren, die dann in die Zieldatenbank übertragen werden.
Vorbereitungen
Für diesen Artikel nutzen wir ein Projekt auf Basis der Vorlage Visual C#|Windows Desktop|WPF-App namens CustomerManagement. Die Techniken lassen sich aber auch in Projekten auf Basis anderer Vorlagen nutzen, beispielsweise in Webanwendungen.
Fügen Sie dem Projekt ein ADO.NET Entity Data Model hinzu.
- Dazu betätigen Sie den Kontextmenü-Eintrag Hinzufügen|Neues Element des Projekt-Eintrags im Projektmappen-Explorer.
- Im nun erscheinenden Dialog Neues Element hinzufügen wählen Sie den Eintrag ADO.NET Entity Data Model aus. Das Element benennen wir mit CustomerManagementContext.
- Wählen Sie im folgenden Dialog die Option Leeres Code First-Modell aus.
Damit erstellt der Assistent nun eine neue Klasse namens CustomerManagementContext.cs, die ein paar auskommentierte Beispielanweisungen enthält. Außerdem finden Sie in der Datei App.conf ein Element namens connectionStrings. Hier passen wir den Namen der zu erstellenden Datenbank mit dem Attribut initial catalog auf CustomerManagement an:
<connectionStrings>
<add name="CustomerManagementContext" connectionString="data source=(LocalDb)MSSQLLocalDB; initial catalog=CustomerManagement;integrated security=True;MultipleActiveResultSets=True; App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
Dadurch wird die Datenbank beim Erstellen CustomerManagement benannt.
Beispiel
Unser einfaches Beispiel soll eine Klasse namens Customer und eine namens Salutation enthalten und daraus die Tabellen Customers und Salutations erzeugen, die über ein Feld SalutationID der Tabelle Customers und das gleichnamige Feld der Tabelle Salutations miteinander verknüpft sind.
Klassen erstellen und DbContext einrichten
Zur Erinnerung: Wir können die einzelnen Klassen direkt in der Klassendatei CustomerManagementContext.cs unterbringen, aber auch in jeweils einer eigenen Datei. In letzterem Fall würden wir die Klassen aus Gründen der Übersicht in einem Unterverzeichnis namens Model anlegen. Dieses Verzeichnis fügen wir über den Kontextmenü-Eintrag Hinzufügen|Neuer Ordner zum Projektordner hinzu. Dann legen wir darin eine neue Klassendatei namens Customer.cs an. Dadurch wird für diese Klasse automatisch der Namespace CustomerManagement.Models festgelegt, was wir später noch berücksichtigen müssen. Wir ändern die Sichtbarkeit der Klasse auf öffentlich (public) und fügen ein paar Felder hinzu – unter anderem ein Feld namens ID, das später als Primärschlüsselfeld verwendet werden soll und eines namens SalutationID, das als Fremdschlüsselfeld zur Tabelle Salutations zum Einsatz kommt:
namespace CustomerManagement.Models {
public class Customer {
public int ID { get; set; }
public string Company { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int SalutationID { get; set; }
}
}
Auf die gleiche Weise erzeugen wir eine Klasse für die Anreden, die wir Salutation nennen. Auch diese legen wir im Verzeichnis Models an und stellen die Sichtbarkeit auf öffentlich ein. Dieses Klasse soll die Felder ID und Name erhalten:
namespace CustomerManagement.Models {
public class Salutation {
public int ID { get; set; }
public string Name { get; set; }
}
}
Nun müssen wir noch die DbSet-Elemente in der Klasse CustomerManagementContext hinzufügen. Damit wir dabei auf die Klassen Customer und Salutation als Datentypen der Auflistungen zugreifen können, machen wir den Namespace CustomerManagement.Models mit der using-Anweisung verfügbar:
namespace CustomerManagement {
...
using CustomerManagement.Models;
Dann folgt die eigentliche Klasse mit dem zunächst leeren Konstruktor:
public class CustomerManagementContext : DbContext {
public CustomerManagementContext() : base("name=CustomerManagementContext") {
}
Diese enthält dann schließlich die DbSet-Elemente für die Customers- und die Salutations-Auflistungen:
public virtual DbSet<Salutation> Salutations { get; set; }
public virtual DbSet<Customer> Customers { get; set; }
}
}
Damit haben wir die Voraussetzungen geschaffen, erstmalig die Datenbank zu erstellen. Das erledigen wir initial mit den drei folgenden Anweisungen, die wir in der Paket-Manager-Konsole absetzen. Die erste lautet wie folgt und aktiviert die Migration zum Datenbankserver. Dabei wird ein Verzeichnis namens Migrations erstellt sowie eine Datei namens Configurations.cs, die unter anderem die Seed-Methode enthält, in der Sie Anweisungen zum Füllen der erzeugten Tabellen mit Daten hinzufügen können (dieser Befehl ist ab Version 2.1 nicht mehr nötig):
enable-migrations
Die zweite erstellt den Code für die initiale Migration. Dieser wird in der Datei angelegt, die mit einer Zahl beginnt und mit ...Init.cs endet:
add-migration Init
Nun müssen Sie die Migration nur noch aufrufen, was Sie zum Beispiel mit der folgenden Anweisung erledigen:
update-database
Alternativ können Sie dafür sorgen, dass die Migrationen beim Start der Anwendung automatisch durchgeführt werden. Dazu rufen Sie einmalig den folgenden Befehl in der Paket-Manager-Konsole auf:
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.