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

Genau wie 1:n-Beziehungen können Sie mit Code First auch m:n-Beziehungen abbilden. Wer denkt, dass dazu wie in Datenbanksystem eine Art Verknüpfungsklasse notwendig ist, hat Recht – diese ist aber nur in bestimmten Fällen notwendig. Welche das sind und wie Sie die verschiedenen Arten einer m:n-Beziehung unter Code First abbilden, erfahren Sie in diesem Artikel. Außerdem zeigen wir, welche Datenmodelle beim Migrieren der Klassen in ein Datenbanksystem entstehen.

Vorbereitungen

Die Vorbereitungen laufen wie im Artikel EDM: 1:n-Beziehungen per Code First beschrieben.

Verschiedene Arten von m:n-Beziehungen

Wir kümmern uns in diesem Artikel um zwei verschiedene Arten von m:n-Beziehungen. Die erste Art geht davon aus, dass nur die Beziehung zwischen den Elementen zweier Klassen abgebildet werden soll. Das kann zum Beispiel die Beziehung zwischen Artikeln und Kategorien sein. Sie können jedem Artikel eine oder mehrere Kategorien zuweisen und jeder Kategorie ein oder mehrere Artikel. Dabei sind für eine Beziehung keine weiteren Informationen notwendig. Die zweite Art der Beziehung enthält zusätzliche Informationen zu jeder Kombination der beteiligten Klassen. Dabei kann es sich etwa die Beziehung zwischen einer Bestellung und den darin enthaltenen Artikeln handeln. Jede Bestellung kann mehrere Artikel enthalten und umgekehrt – insofern unterscheidet sich dies nicht von der einfachen m:n-Beziehung. Allerdings wollen wir in diesem Fall zu jeder Kombination noch weitere Informationen speichern, im einfachsten Fall die Menge der bestellten Artikel in einer Bestellung. Hier würden wir im Datenbanksystem einfach ein weiteres Feld zu der Verknüpfungstabelle hinzufügen. In der Modellierung der Klassen ergeben sich weitreichendere Unterschiede, wie die folgenden Beispiele zeigen werden.

Klassen für eine einfache m:n-Beziehung

Wir wollen zunächst eine einfache m:n-Beziehung abbilden, wie sie zwischen Artikeln und Kategorien vorgenommen wird. Dazu legen wir als Erstes die einfachen Klassen für diese beiden Entitäten an – in unserem Beispiel im Verzeichnis Data. Die Klasse enthält die Felder ID, Name und Price:

namespace EDMFluentAPI.Data {
     public class Article {
         public int ID { get; set; }
         public string Name { get; set; }
         public decimal Price { get; set; }
     }
}

Die Klasse für die Kategorien halten wir noch einfacher – sie soll nur das Feld ID und das Feld Name enthalten:

public class Category {
     public int ID { get; set; }
     public string Name { get; set; }
}

Wie stellen wir nun die Beziehung her? Das gelingt ganz einfach, indem wir beiden Klassen jeweils eine ICollection-Auflistung mit dem Typ des jeweils zu verknüpfenden Elements hinzufügen. Zunächst für die Klasse Article:

public class Article {
     ...
     public ICollection<Category> Categories { get; set; }
}

Für die Klasse Category sieht das andersherum aus:

public class Category {
     ...
     public ICollection<Article> Articles { get; set; }
}

Wir dürfen natürlich nicht vergessen, beide Klassen über entsprechende DbSet-Auflistungen zum Datenbankkontext hinzuzufügen:

public class CustomerManagementContext : DbContext {
     ...

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]