Ho lottato con questo per un po 'e non riesco proprio a capire cosa sta succedendo. Ho un'entità Carta che contiene i Lati (di solito 2) - e sia le Carte che i Lati hanno uno Stage. Sto usando EF Codefirst migrations e le migrazioni non riescono con questo errore:
L'introduzione del vincolo FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' nella tabella 'Lati' può causare cicli o percorsi multipli a cascata. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION o modificare altri vincoli ESTERI CHIAVE.
Ecco l' entità della mia carta :
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; }
}
Ecco la mia 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; }
}
Ed ecco la mia 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; } }
}
La cosa strana è che se aggiungo quanto segue alla mia classe Stage:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
La migrazione viene eseguita correttamente. Se apro SSMS e guardo le tabelle, posso vedere che Stage_StageIdè stato aggiunto a Cards(come previsto / desiderato), tuttavia Sidesnon contiene alcun riferimento a Stage(non previsto).
Se poi aggiungo
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Alla mia classe Side, vedo la StageIdcolonna aggiunta alla mia Sidetabella.
Funziona, ma ora in tutta la mia applicazione, ogni riferimento a Stagecontiene a SideId, che in alcuni casi è totalmente irrilevante. Vorrei solo dare a my Carded Sideentity una Stageproprietà basata sulla classe Stage sopra senza inquinare la classe stage con proprietà di riferimento, se possibile ... cosa sto facendo di sbagliato?
DeleteBehavior.Restricto DeleteBehavior.SetNull.
SideClasse aggiungi intero Nullable e rimuovi[Required]attributo =>public int? CardId { get; set; }