2013-03-01 1 views
23

Ich habe eine viele zu viele Beziehung und ich möchte zusätzliche Daten in der Couple-Tabelle speichern, mit Code First Fluent API.Viele zu viele Zuordnung mit zusätzlichen Feldern in fließender API

Wie kann dies erreicht werden?

Mein Modell:

Ein Benutzer 1 oder mehr haben können Abzeichen (optional) kann ein Abzeichen an einen oder mehrere Benutzer (optional) gehören. Ich möchte ein zusätzliches Feld (B genannt) speichern, damit diese Beziehung gespeichert wird. Die Tabelle sollte UserBadges mit den folgenden Feldern genannt werden: UserId, BadgeId, B

(ich habe diese here früher in Stackoverflow gesehen, aber ich das Modell ist etwas komplex und keine Antwort korrekt schon gegeben worden)

Antwort

43

Sie können es nicht direkt als "Viele-zu-Viele" abbilden. Wenn Sie zusätzliches Feld in die Verknüpfungstabelle hinzufügen, und Sie wollen das Feld für den Zugriff auf die Anwendung benötigen Sie eine Verknüpfungstabelle auf Einheit zu fördern, statt und verwenden zwei Eins-zu-viele Beziehungen:

public class Badge { 
    ... 
    public virtual ICollection<UserBadge> UserBadges { get; set; } 
} 

public class User { 
    ... 
    public virtual ICollection<UserBadge> UserBadges { get; set; } 
} 

public class UserBadge { 
    public int UserId { get; set; } 
    public int BadgeId { get; set; } 
    public string B { get; set; } 
    public virtual Badge Badge { get; set; } 
    public virtual User User { get; set; } 
} 

Die Standard Konventionen sollten Definieren Sie das Mapping korrekt mit Ausnahme des Schlüssels für die Tabelle UserBadge, die entweder in Fluent-API oder in Datenanmerkungen erfolgen muss.

+1

Thx, aber ich bezweifle, wenn dies funktioniert, weil Sie UserId und BadgeId als eine Verbindung PK definieren. Es sollte möglich sein, 2 Datensätze mit der gleichen UserId und BadgeId zu haben, der B-Wert macht den eindeutigen Wert davon (es ist ein FK zu einer anderen Tabelle). –

+0

@PatrickPeters: In diesem Fall müssen Sie PK anders definieren, aber der Punkt der Antwort ist immer noch derselbe - Sie müssen die Junction-Tabelle als Entität verfügbar machen. –

+0

Ja Ladislav, du hast vollkommen Recht. Ich habe das nach deiner Antwort behoben und es funktioniert. –