【问题标题】:Prevent CASCADE DELETE that causes "cycles or multiple cascade paths"防止导致“循环或多级联路径”的 CASCADE DELETE
【发布时间】:2014-01-28 12:03:37
【问题描述】:

我有这样的关系

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

请注意,Widget 在对象模型中没有 WidgetPair 的概念。

当我尝试使用 EF Code First 迁移更新我的数据库时,我收到错误

在表 'WidgetPairs' 上引入 FOREIGN KEY 约束 'FK_dbo.WidgetPairs_dbo.Widget_WidgetAId' 可能会导致循环或多个级联路径

有道理,因为 SQL Server 不喜欢two properties from the table pointing to the same parent

期望的行为是,如果给定的 WidgetPair.WidgetA(或 .WidgetB)指向随后被删除的特定 Widget,则 WidgetA(或 WidgetB)变为 null。

我不希望 Widget 表或 WidgetPairs 表中的删除来删除另一个表中的一行。

似乎我可以使用流畅的界面进行配置,但我无法确切了解如何做到这一点。如果我想添加从 Widget 到 WidgetPair 的引用(我这样做 not),以下似乎可行:

modelBuilder.Entity<WidgetPair>().HasOptional(p => p.WidgetA)
  .WithMany(q => q.TheChildWidget)
  .WillCascadeOnDelete(false);

这是行不通的,因为一个 Widget 可以参与多个 WidgetPairs。此外,Widget 没有域要求直接知道它参与的 WidgetPairs。

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

【问题讨论】:

    标签: entity-framework ef-code-first entity-framework-5


    【解决方案1】:

    事实证明,我通过使用类型 int 作为外键,使从 WidgetPair 到 Widget 的关系不可为空。这反过来会导致级联删除。

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 2020-05-21
      • 2016-03-26
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2020-06-14
      • 2018-12-19
      相关资源
      最近更新 更多