Je viens de commencer à utiliser le code EF en premier, donc je suis un débutant total dans cette rubrique.
Je voulais créer des relations entre les équipes et les matchs:
1 match = 2 équipes (domicile, invité) et résultat.
J'ai pensé qu'il était facile de créer un tel modèle, alors j'ai commencé à coder:
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; }
}
Et je reçois une exception:
La relation référentielle se traduira par une référence cyclique qui n'est pas autorisée. [Nom de la contrainte = Match_GuestTeam]
Comment puis-je créer un tel modèle, avec 2 clés étrangères vers la même table?
Il est également possible de spécifier l'
ForeignKey()
attribut sur la propriété de navigation:De cette façon, vous n'avez pas besoin d'ajouter de code à la
OnModelCreate
méthodela source
OnModelCreate
selon la réponse acceptée ainsi que les deux collections pour les deux côtés de la relation.Je sais que c'est un poste vieux de plusieurs années et vous pouvez résoudre votre problème avec la solution ci-dessus. Cependant, je veux juste suggérer d'utiliser InverseProperty pour quelqu'un qui en a encore besoin. Au moins, vous n'avez rien à changer dans OnModelCreating.
Le code ci-dessous n'est pas testé.
Vous pouvez en savoir plus sur InverseProperty sur MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships
la source
Vous pouvez également essayer ceci:
Lorsque vous faites une colonne FK autoriser NULLS, vous rompez le cycle. Ou nous trichons simplement le générateur de schéma EF.
Dans mon cas, cette simple modification résout le problème.
la source
En effet, les suppressions en cascade sont activées par défaut. Le problème est que lorsque vous appelez une suppression sur l'entité, elle supprimera également chacune des entités référencées par la touche f. Vous ne devez pas rendre les valeurs «requises» nulles pour résoudre ce problème. Une meilleure option serait de supprimer la convention de suppression en cascade d'EF Code First:
Il est probablement plus sûr d'indiquer explicitement quand effectuer une suppression en cascade pour chacun des enfants lors du mappage / de la configuration. l'entité.
la source
Restrict
au lieu deCascade
?InverseProperty
dans EF Core rend la solution simple et propre.InverseProperty
La solution souhaitée serait donc:
la source