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_StageId
a été ajouté à Cards
(comme prévu / souhaité), mais Sides
ne 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 StageId
colonne ajoutée à ma Side
table.
Cela fonctionne, mais maintenant tout au long de mon application, toute référence à Stage
contient un SideId
, qui est dans certains cas totalement hors de propos. Je voudrais juste donner à mes entités Card
et Side
une Stage
proprié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.Restrict
ou DeleteBehavior.SetNull
.
Side
classe, ajoutez un entier nul et supprimez l'[Required]
attribut =>public int? CardId { get; set; }