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; }