EDM: 1:1-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:1-Beziehungen per Code First

Im Artikel »EDM: 1:n-Beziehungen per Code First« haben wir gezeigt, wie Sie unter Nutzung des Entity Frameworks zwei Klassen so gestalten, dass diese beim Migrieren in einer SQL Server-Datenbank in zwei miteinander per 1:n-Beziehung verknüpfte Tabellen umgewandelt werden. Die 1:1-Beziehung ist ein Spezialfall der 1:n-Beziehung, für die eine kleine Sonderbehandlung notwendig ist. Wie des gelingt, zeigt der vorliegende Beitrag.

Vorbereitungen

Für diesen Artikel nutzen wir ein Projekt auf Basis der Vorlage Visual C#|Windows Desktop|WPF-App namens EDMConfigure11. Die Techniken lassen sich aber auch in Projekten auf Basis anderer Vorlagen nutzen, beispielsweise in Webanwendungen. Wir fügen wie im Artikel EDM: 1:n-Beziehungen per Code First ein ADO.NET Entity Data Model hinzu, wieder namens CustomerManagementContext, und starten auch hier wieder mit einem leeren Code First-Modell. Das Attribut initial catalog in der Verbindungszeichenfolge in der Datei App.conf stellen wir auf EDMConfigure11.CustomerManagement ein.

Beispiel

Unser einfaches Beispiel soll eine Klasse namens Customer und eine namens CustomerInvoiceAddress enthalten und daraus die Tabellen Customers und CustomerInvoiceAddresses erzeugen, die über die Felder ID der Tabelle Customers und das gleichnamige Feld der Tabelle CustomerInvoiceAddresses miteinander verknüpft sind.

Klassen erstellen und DbContext einrichten

In einem neuen Verzeichnis namens Data legen wir die als öffentlich deklarierte Klasse namens Customer.cs mit dem folgenden Code an:

namespace CustomerManagement.Data {
     public class Customer {
         public int ID { get; set; }
         public string Company { get; set; }
         public string FirstName { get; set; }
         public string LastName { get; set; }
     }
}

Auf die gleiche Weise erzeugen wir eine Klasse für die Rechnungsadressen, die wir CustomerInvoiceAddress nennen. Auch diese legen wir im Verzeichnis Data an und stellen die Sichtbarkeit auf öffentlich ein:

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.Data mit der using-Anweisung verfügbar:

namespace EDMConfigure11.Data {
     public class CustomerInvoiceAddress {
         public int ID { get; set; }
         public string Street { get; set; }
         public string Zip { get; set; }
         public string City { get; set; }
     }
}

Die Datei CustomerManagementContext.cs passen wir nun wie folgt an. Dabei fügen wir per using-Anweisung den Namespace EDMConfigure11.Data an, damit wir auf die in dem Verzeichnis Data enthaltenen Klassen, die dort auch mit dem entsprechenden Namespace versehen sind, zugreifen können. Außerdem erweitern wir die Klasse um die beiden DbSet-Elemente namens Customers und CustomersInvoiceAddresses:

namespace EDMConfigure11 {
     ...
     using EDMConfigure11.Data;
     public class CustomerManagementContext : DbContext {
         public CustomerManagementContext()
             : base("name=CustomerManagementContext") {
         }
         public virtual DbSet<Customer> Customers { get; set; }
         public virtual DbSet<CustomerInvoiceAddress> CustomerInvoiceAddresses { get; set; }
     }
}

Datenbank erstellen

Nun migrieren wir die Klassen erstmals in die Zieldatenbank, die noch zu erstellen ist. Um das Migrieren aus dem Projekt heraus zu ermöglichen, rufen wir zunächst die folgende Anweisung in der Paket-Manager-Konsole auf, was das Verzeichnis Migrations mit der Datei Configure.cs erstellt:

enable-migrations

Dann erstellen wir das Skript für die erste Migration, was eine Datei zum Verzeichnis Migrations hinzufügt, die auf _Init.cs endet:

add-migration Init

Schließlich erstellen wir erstmalig die Datenbank:

update-database

Dies erstellt die beiden Tabellen Customers und CustomerInvoiceAddresses in der neuen Datenbank EDMConfigure11.CustomerManagement. Allerdings enthalten diese noch keinerlei Beziehung zueinander, wie Bild 1 zeigt.

Definitionen der Tabellen Customers und CustomerInvoiceAddresses

Bild 1: Definitionen der Tabellen Customers und CustomerInvoiceAddresses

1:1-Beziehung erzeugen

Wenn wir bei der 1:n-Beziehung der Klasse, welche die Seite der Beziehung mit dem Fremdschlüsselfeld der Beziehung bilden soll, eine Eigenschaft des Typs der zu verknüpfenden Klasse zugewiesen haben, kann dies auch hier nicht verkehrt sein. Also fügen wir die Eigenschaft CustomerInvoiceAddress mit dem entsprechenden Namen zu Customer.cs hinzu:

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]