我已经为此努力了一段时间,无法完全了解发生了什么。我有一个包含Sides(通常为2)的Card实体-Cards和Sides都有一个Stage。我正在使用EF Codefirst迁移,并且迁移因以下错误而失败:
在表“ Sides”上引入FOREIGN KEY约束“ FK_dbo.Sides_dbo.Cards_CardId”可能会导致循环或多个级联路径。指定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; }
}
这是我的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; }
}
这是我的舞台实体:
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
类中添加Nullable整数并删除[Required]
属性=>public int? CardId { get; set; }