Я певний час боровся з цим і не можу повністю зрозуміти, що відбувається. У мене є об'єкт картки, який містить сторони (зазвичай 2) - і картки, і сторони мають етап. Я використовую EF Codefirst міграції, і міграції не вдається з цією помилкою:
Введення обмеження FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' на таблиці 'Sides' може спричинити цикли або кілька каскадних шляхів. Вкажіть УВІДКЛЮЧАТИ НЕ ДІЙ чи НА ОНОВЛЕННЯ НЕ ДІЇ, або змініть інші обмеження ЗОВНІШНЬОГО КЛЮЧА.
Ось моя картка особа:
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; }
}
Ось моя сторона :
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; }
}
І ось моя сценічна суть:
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; } }
}
Що дивно, що якщо я додаю наступне до свого класу Stage:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
Міграція проходить успішно. Якщо я відкрию SSMS і переглядаю таблиці, я можу побачити, що Stage_StageId
додано до Cards
(як очікувалося / бажано), однак Sides
не містить посилання на Stage
(не очікується).
Якщо я потім додам
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Для мого бічного класу я бачу StageId
стовпець, доданий до моєї Side
таблиці.
Це працює, але зараз у всій моїй заяві будь-яке посилання на Stage
містить а SideId
, що в деяких випадках абсолютно не має значення. Я хотів би просто надати моєму Card
та Side
сукупності Stage
властивості на основі вищевказаного класу Stage, не забруднюючи клас класу еталонними властивостями, якщо це можливо ... що я роблю неправильно?
DeleteBehavior.Restrict
або DeleteBehavior.SetNull
.
Side
Class додайте Nullable ціле число та видаліть[Required]
атрибут =>public int? CardId { get; set; }