Entity framework 防止级联删除导致;循环或多个级联路径“;

Entity framework 防止级联删除导致;循环或多个级联路径“;,entity-framework,ef-code-first,entity-framework-5,Entity Framework,Ef Code First,Entity Framework 5,我有一段像这样的关系 public class Widget { public virtual int Id { get; set; } public virtual string Text { get; set; } } public class WidgetPair { public virtual int Id { get; set; } public virtual Widget WidgetA { get; set; } public vir

我有一段像这样的关系

public class Widget
{
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }
}

public class WidgetPair
{
    public virtual int Id { get; set; }

    public virtual Widget WidgetA { get; set; }
    public virtual int WidgetAId { get; set; }

    public virtual Widget WidgetB { get; set; }
    public virtual int WidgetBId { get; set; }
}
注意,小部件在对象模型中没有WidgetPair的概念

当我尝试使用EF Code First迁移更新数据库时,会出现错误

在表“WidgetPairs”上引入外键约束“FK_dbo.WidgetPairs_dbo.WidgetAId”可能会导致循环或多个级联路径

有道理,因为SQL Server不喜欢

所需的行为是,如果给定的WidgetPair.WidgetA(或.WidgetB)指向随后被删除的特定小部件,则WidgetA(或WidgetB)将变为null

我不希望通过小部件表或WidgetPairs表中的删除来删除另一个表中的行

看起来我可以使用fluent界面来配置它,但我看不出具体的方法。如果我想添加一个从Widget到WidgetPair的引用(我没有这样做),下面的代码似乎可以:

modelBuilder.Entity<WidgetPair>().HasOptional(p => p.WidgetA)
  .WithMany(q => q.TheChildWidget)
  .WillCascadeOnDelete(false);
modelBuilder.Entity().has可选(p=>p.WidgetA)
.WithMany(q=>q.TheChildWidget)
.WillCascadeOnDelete(假);
这将不起作用,因为单个小部件可以参与多个WidgetPairs。此外,对于一个小部件来说,没有域要求它直接知道它参与了哪些WidgetPairs


是否可以配置此行为?怎么做?

事实证明,我使用int类型作为外键,使WidgetPair与Widget之间的关系不可为null。这进而导致级联删除

将类型更改为int?解决此问题:

public virtual Widget WidgetA { get; set; }
public virtual int? WidgetAId { get; set; }