Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
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: