Я боролся с этим некоторое время и не могу понять, что происходит. У меня есть объект карты, который содержит стороны (обычно 2), и обе карты и стороны имеют этап. Я использую EF Codefirst миграции, и миграции не работают с этой ошибкой:
Представление ограничения FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' on Таблица "Стороны" может вызывать циклы или несколько каскадных путей. Укажите ON УДАЛИТЬ НЕТ ДЕЙСТВИЯ или НЕ ОБНОВИТЬ НЕТ ДЕЙСТВИЙ, или изменить другой ИНОСТРАННЫЙ КЛЮЧ ограничения.
Здесь моя Карточка:
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; }
}
И здесь мой объект 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; } }
}
Что странно, если я добавлю следующее в мой класс 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, без загрязнения класса сцены ссылочными свойствами, если возможно... что я делать не так?