我的数据库中有两个相互引用的类,如下面的示例所示。
Parent
可以有任意数量的Child
对象,并且我设置了一个外键约束以使Child.ParentID
引用Parent.ID
;为该关系设置DeleteBehavior.Cascade
可以确保在删除Parent
时也删除所有Child
对象。
问题是我还需要引用Child
类中的Parent
对象之一,在下面的示例中称为PreferredChild
。我期望在设置Parent.PreferredChildId
的情况下在Child.ID
和DeleteBehavior.SetNull
之间创建约束,但是实际上发生的是在删除Parent
对象时,如果{{ 1}}已设置,出现此异常:
System.InvalidOperationException:'由于在要保存的数据中检测到循环依赖性,因此无法保存更改:'Parent [已删除] PreferredChild PreferredParent {'PreferredChildID'} <-Child [已删除]父子项{' ParentID'} <-父级[已删除]'。'
是否可以对此建模,以便无需先取消设置PreferredChildID
就可以删除Parent
对象?
PreferredChildID
答案 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])
);
这样,循环依赖就没有任何问题。
如果删除父项,则preferredchilds
和children
表中的条目也将被删除。