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 Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]