循环依赖删除(EF核心)

时间:2020-06-23 13:53:05

标签: c# .net-core entity-framework-core

我的数据库中有两个相互引用的类,如下面的示例所示。

Parent可以有任意数量的Child对象,并且我设置了一个外键约束以使Child.ParentID引用Parent.ID;为该关系设置DeleteBehavior.Cascade可以确保在删除Parent时也删除所有Child对象。

问题是我还需要引用Child类中的Parent对象之一,在下面的示例中称为PreferredChild。我期望在设置Parent.PreferredChildId的情况下在Child.IDDeleteBehavior.SetNull之间创建约束,但是实际上发生的是在删除Parent对象时,如果{{ 1}}已设置,出现此异常:

System.InvalidOperationException:'由于在要保存的数据中检测到循环依赖性,因此无法保存更改:'Parent [已删除] PreferredChild PreferredParent {'PreferredChildID'} <-Child [已删除]父子项{' ParentID'} <-父级[已删除]'。'

是否可以对此建模,以便无需先取消设置PreferredChildID就可以删除Parent对象?

PreferredChildID

1 个答案:

答案 0 :(得分:1)

为什么不只是执行以下操作?

public class Parent 
{
    public int? ID { get; set; }
    public int? LastChildID => LastChild?.ID;

    public virtual Child LastChild => Children?.LastOrDefault();
    public virtual ICollection<Child> Children { get; set; }
}

编辑:OP编辑完他的问题后,他想要的更加清楚。

我建议添加第三个这样的表

CREATE TABLE [dbo].[PreferredChilds] (
    [ParentId]     INT          NOT NULL,
    [PreferredChild] INT    NOT NULL,
    PRIMARY KEY CLUSTERED ([ParentId] ASC, [PreferredChild] ASC),
    FOREIGN KEY ([ParentId]) REFERENCES [dbo].[Parents] ([Id]),
    FOREIGN KEY ([PreferredChild]) REFERENCES [dbo].[Children] ([Id])
);

这样,循环依赖就没有任何问题。 如果删除父项,则preferredchildschildren表中的条目也将被删除。