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 Sides
non 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 StageId
colonna aggiunta alla mia Side
tabella.
Funziona, ma ora in tutta la mia applicazione, ogni riferimento a Stage
contiene a SideId
, che in alcuni casi è totalmente irrilevante. Vorrei solo dare a my Card
ed Side
entity una Stage
proprietà basata sulla classe Stage sopra senza inquinare la classe stage con proprietà di riferimento, se possibile ... cosa sto facendo di sbagliato?
DeleteBehavior.Restrict
o DeleteBehavior.SetNull
.
Side
Classe aggiungi intero Nullable e rimuovi[Required]
attributo =>public int? CardId { get; set; }