Właśnie zacząłem używać kodu EF, więc jestem całkowitym początkującym w tym temacie.
Chciałem stworzyć relacje między drużynami i meczami:
1 mecz = 2 drużyny (gospodarz, gość) i wynik.
Pomyślałem, że łatwo jest stworzyć taki model, więc zacząłem kodować:
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; }
}
I dostaję wyjątek:
Relacja referencyjna spowoduje cykliczne odwołanie, które jest niedozwolone. [Ograniczenie nazwa = Match_GuestTeam]
Jak mogę stworzyć taki model z 2 kluczami obcymi do tej samej tabeli?
Możliwe jest również określenie
ForeignKey()
atrybutu we właściwości nawigacji:W ten sposób nie musisz dodawać żadnego kodu do
OnModelCreate
metodyźródło
OnModelCreate
zgodnie z przyjętą odpowiedzią, a także dwóch kolekcji dla obu stron relacji.Wiem, że to post ma kilka lat i możesz rozwiązać swój problem z powyższym rozwiązaniem. Chcę tylko zasugerować użycie InverseProperty dla kogoś, kto nadal potrzebuje. Przynajmniej nie musisz nic zmieniać w OnModelCreating.
Poniższy kod nie został przetestowany.
Możesz przeczytać więcej o InverseProperty na MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships
źródło
Możesz też spróbować:
Kiedy tworzysz kolumnę FK zezwalającą na NULLS, przerywasz cykl. Lub po prostu oszukujemy generator schematu EF.
W moim przypadku ta prosta modyfikacja rozwiązuje problem.
źródło
Wynika to z tego, że usuwanie kaskadowe jest domyślnie włączone. Problem polega na tym, że wywołanie operacji usuwania na encji spowoduje również usunięcie każdej z encji, do których odwołuje się klawisz F. Nie należy dopuszczać, aby wartości „wymagane” były zerowane, aby rozwiązać ten problem. Lepszym rozwiązaniem byłoby usunięcie konwencji usuwania kaskadowego kodu EF First:
Prawdopodobnie bezpieczniej jest jednoznacznie wskazać, kiedy wykonać mapowanie kaskadowe dla każdego z dzieci podczas mapowania / konfiguracji. jednostka.
źródło
Restrict
zamiastCascade
?InverseProperty
w EF Core sprawia, że rozwiązanie jest łatwe i czyste.InverseProperty
Tak więc pożądanym rozwiązaniem byłoby:
źródło