Je lutte avec ça depuis un moment et je n'arrive pas à comprendre ce qui se passe. J'ai une entité Carte qui contient des côtés (généralement 2) - et les cartes et les côtés ont une étape. J'utilise les migrations EF Codefirst et les migrations échouent avec cette erreur:
L'introduction de la contrainte FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' sur la table 'Sides' peut provoquer des cycles ou plusieurs chemins de cascade. Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifiez d'autres contraintes FOREIGN KEY.
Voici mon entité Carte :
public class Card
{
public Card()
{
Sides = new Collection<Side>();
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int CardId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
[ForeignKey("CardId")]
public virtual ICollection<Side> Sides { get; set; }
}
Voici mon entité Side :
public class Side
{
public Side()
{
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int SideId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
public int CardId { get; set; }
[ForeignKey("CardId")]
public virtual Card Card { get; set; }
}
Et voici mon entité Stage :
public class Stage
{
// Zero
public static readonly Stage ONE = new Stage(new TimeSpan(0, 0, 0), "ONE");
// Ten seconds
public static readonly Stage TWO = new Stage(new TimeSpan(0, 0, 10), "TWO");
public static IEnumerable<Stage> Values
{
get
{
yield return ONE;
yield return TWO;
}
}
public int StageId { get; set; }
private readonly TimeSpan span;
public string Title { get; set; }
Stage(TimeSpan span, string title)
{
this.span = span;
this.Title = title;
}
public TimeSpan Span { get { return span; } }
}
Ce qui est étrange, c'est que si j'ajoute ce qui suit à ma classe Stage:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
La migration a réussi. Si j'ouvre SSMS et regarde les tableaux, je peux voir qu'il Stage_StageIda été ajouté à Cards(comme prévu / souhaité), mais Sidesne contient aucune référence à Stage(non attendu).
Si j'ajoute ensuite
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Pour ma classe Side, je vois une StageIdcolonne ajoutée à ma Sidetable.
Cela fonctionne, mais maintenant tout au long de mon application, toute référence à Stagecontient un SideId, qui est dans certains cas totalement hors de propos. Je voudrais juste donner à mes entités Cardet Sideune Stagepropriété basée sur la classe Stage ci-dessus sans polluer la classe Stage avec des propriétés de référence si possible ... que fais-je de mal?
DeleteBehavior.Restrictou DeleteBehavior.SetNull.
Sideclasse, ajoutez un entier nul et supprimez l'[Required]attribut =>public int? CardId { get; set; }