Ich habe gerade erst angefangen, EF-Code zu verwenden, daher bin ich ein absoluter Anfänger in diesem Thema.
Ich wollte Beziehungen zwischen Teams und Spielen herstellen:
1 Spiel = 2 Mannschaften (Heim, Gast) und Ergebnis.
Ich dachte, es sei einfach, ein solches Modell zu erstellen, und begann mit dem Codieren:
public class Team
{
[Key]
public int TeamId { get; set;}
public string Name { get; set; }
public virtual ICollection<Match> Matches { get; set; }
}
public class Match
{
[Key]
public int MatchId { get; set; }
[ForeignKey("HomeTeam"), Column(Order = 0)]
public int HomeTeamId { get; set; }
[ForeignKey("GuestTeam"), Column(Order = 1)]
public int GuestTeamId { get; set; }
public float HomePoints { get; set; }
public float GuestPoints { get; set; }
public DateTime Date { get; set; }
public virtual Team HomeTeam { get; set; }
public virtual Team GuestTeam { get; set; }
}
Und ich bekomme eine Ausnahme:
Die Referenzbeziehung führt zu einer zyklischen Referenz, die nicht zulässig ist. [Einschränkungsname = Match_GuestTeam]
Wie kann ich ein solches Modell mit 2 Fremdschlüsseln für dieselbe Tabelle erstellen?
Es ist auch möglich, das
ForeignKey()
Attribut in der Navigationseigenschaft anzugeben :Auf diese Weise müssen Sie der
OnModelCreate
Methode keinen Code hinzufügenquelle
OnModelCreate
gemäß der akzeptierten Antwort sowie den beiden Sammlungen für beide Seiten der Beziehung hinzuzufügen .Ich weiß, dass es ein mehrere Jahre alter Beitrag ist und Sie Ihr Problem mit der oben genannten Lösung lösen können. Ich möchte jedoch nur vorschlagen, InverseProperty für jemanden zu verwenden, der es noch benötigt. Zumindest müssen Sie in OnModelCreating nichts ändern.
Der folgende Code ist nicht getestet.
Weitere Informationen zu InverseProperty finden Sie auf MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships
quelle
Sie können dies auch versuchen:
Wenn Sie eine FK-Spalte NULLS zulassen, unterbrechen Sie den Zyklus. Oder wir betrügen nur den EF-Schema-Generator.
In meinem Fall löst diese einfache Änderung das Problem.
quelle
Dies liegt daran, dass Kaskadenlöschungen standardmäßig aktiviert sind. Das Problem ist, dass beim Aufrufen eines Löschvorgangs für die Entität auch alle Entitäten gelöscht werden, auf die mit dem F-Schlüssel verwiesen wird. Sie sollten 'erforderliche' Werte nicht auf null setzen, um dieses Problem zu beheben. Eine bessere Option wäre, die Cascade-Löschkonvention von EF Code First zu entfernen:
Es ist wahrscheinlich sicherer, beim Zuordnen / Konfigurieren explizit anzugeben, wann für jedes der untergeordneten Elemente eine Kaskadenlöschung durchgeführt werden soll. die Entität.
quelle
Restrict
stattCascade
?InverseProperty
in EF Core macht die Lösung einfach und sauber.InverseProperty
Die gewünschte Lösung wäre also:
quelle