Zmagam się z tym od dłuższego czasu i nie mogę do końca zrozumieć, co się dzieje. Mam encję Karty, która zawiera Strony (zwykle 2) - a obie Karty i Strony mają scenę. Korzystam z migracji EF Codefirst i migracje kończą się niepowodzeniem z powodu tego błędu:
Wprowadzenie ograniczenia OBCEGO KLUCZA „FK_dbo.Sides_dbo.Cards_CardId” w tabeli „Strony” może powodować cykle lub wiele ścieżek kaskadowych. Określ NA USUŃ BRAK AKCJI lub NA AKTUALIZACJĘ BEZ AKCJI, lub zmodyfikuj inne KLUCZE OBCE.
Oto moja karta Card :
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; }
}
Oto moja jednostka 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; }
}
A oto moja jednostka 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; } }
}
Dziwne jest to, że jeśli dodam następujące elementy do mojej klasy Stage:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
Migracja przebiega pomyślnie. Jeśli otworzę SSMS i spojrzę na tabele, widzę, że Stage_StageIdzostał dodany do Cards(zgodnie z oczekiwaniami / pożądaniami), jednak Sidesnie zawiera odniesienia do Stage(nie oczekiwano).
Jeśli to dodam
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Do mojej klasy Side widzę StageIdkolumnę dodaną do mojej Sidetabeli.
Działa to, ale teraz w mojej aplikacji każde odniesienie do Stagezawiera SideId, co w niektórych przypadkach jest całkowicie nieistotne. Chciałbym po prostu nadać mojemu Cardi Sidepodmiotom Stagewłaściwość opartą na powyższej klasie Stage bez zanieczyszczania klasy stage właściwościami referencyjnymi, jeśli to możliwe ... co robię źle?
DeleteBehavior.Restrictlub DeleteBehavior.SetNull.
Sideklasie dodaj Nullable integer i usuń[Required]atrybut =>public int? CardId { get; set; }