EDM: 1:n-Beziehungen per Code First

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.

Bitte geben Sie die Zahlenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Aktuell im Blog
Onlinebanking mit Access

Es ist geschafft: Endlich ist das Buch Onlinebanking mit Access fertiggeschrieben. Das war... [mehr]

Direktzugriff auf Tabellen und Felder

Die IntelliSense-Erweiterung für Tabellen und Felder hat mir soviel Spaß gemacht, dass ich gleich... [mehr]

IntelliSense für Tabellen und Felder

Wenn Sie mit dem VBA-Editor arbeiten und dort gelegentlich SQL-Anweisungen eingeben, müssen Sie... [mehr]

Download Access und SQL Server

Erfahren Sie, welche Schritte zum Download des aktuellen Stands des Buchs "Access und SQL Server"... [mehr]

Bilder in Access 2013

Wer die Bibliothek mdlOGL0710 von Sascha Trowitzsch oder ein ähnliches Modul aus meinen... [mehr]

Dynamische Ribbons

Immer wieder fragen Leser, wie man Ribbon-Elemente wie etwa Schaltflächen in Abhängigkeit... [mehr]

Die Blogmaschine

Einen kleinen Blog zusätzlich zum Shop zu betreiben ist eine tolle Sache. Hier lassen sich... [mehr]

Wegwerfadressen für die Newsletteranmeldung

Die Verwendung von Wegwerf-Adressen für die Nutzung aller möglichen Online-Dienste nimmt... [mehr]

Access und Facebook

Facebook und Access - das ist eine der wenigen Kombinationen, die ich noch nicht in die Mangel... [mehr]

Access und SQL Server - das Projekt

Mein neues Buch Access und SQL Server (gemeinsam mit Bernd Jungbluth) geht in die Endphase. Wer... [mehr]