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_StageId
został dodany do Cards
(zgodnie z oczekiwaniami / pożądaniami), jednak Sides
nie 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ę StageId
kolumnę dodaną do mojej Side
tabeli.
Działa to, ale teraz w mojej aplikacji każde odniesienie do Stage
zawiera SideId
, co w niektórych przypadkach jest całkowicie nieistotne. Chciałbym po prostu nadać mojemu Card
i Side
podmiotom Stage
wł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.Restrict
lub DeleteBehavior.SetNull
.
Side
klasie dodaj Nullable integer i usuń[Required]
atrybut =>public int? CardId { get; set; }