Я боролся с этим некоторое время и не могу понять, что происходит. У меня есть сущность Карты, которая содержит Стороны (обычно 2), и у обеих карт и Сторон есть Сцена. Я использую EF Codefirst миграции, и миграции завершаются с ошибкой:
Введение ограничения FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' в таблицу 'Sides' может привести к возникновению циклов или нескольких каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY.
Вот моя сущность карты :
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; }
В моем классе Side я вижу StageId
столбец, добавленный в мою Side
таблицу.
Это работает, но теперь во всем моем приложении любая ссылка на Stage
содержит SideId
, что в некоторых случаях совершенно не имеет значения. Я хотел бы просто дать моим Card
и Side
сущностям Stage
свойство, основанное на вышеуказанном классе Stage, не загрязняя класс stage ссылочными свойствами, если это возможно ... что я делаю неправильно?
DeleteBehavior.Restrict
или DeleteBehavior.SetNull
.
Side
классе добавьте целое число,[Required]
public int? CardId { get; set; }