同一张表之间多对多的级联删除

Posted

技术标签:

【中文标题】同一张表之间多对多的级联删除【英文标题】:Cascade delete on many-to-many between same table 【发布时间】:2012-11-02 11:02:35 【问题描述】:

我正在尝试在 SQL Server 中的同一个表之间创建多对多关系。

我有一张表 Object 与列 ObjectIdName

关系遵循以下规则:

一个孩子可以有多个父母 父母可以有很多孩子 ObjectA 可以是 ObjectB 的子代,ObjectB 可以是 ObjectA 的子代 但对象不能是其自身的直接子对象

所以我创建了第二个表ObjectRelation,其中包含ParentIdChildId 列,当然我希望通过级联删除这些关系。

但是当我在 SQL Server 中尝试这个时,我得到了错误

在表“tblADMembership”上引入 FOREIGN KEY 约束“FK_ObjectRelation_Object1”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

在 SQL Server Compact 我得到

引用关系会导致不被允许的循环引用。

我已经进行了一些研究,并且我理解为什么会出现这些错误,但是有没有办法解决这个问题,它也适用于 SQL Server Compact(所以没有存储过程)?或者有没有更好的方法来模拟这种关系?

【问题讨论】:

【参考方案1】:

我自己也遇到过类似的问题....我最终删除了外键。循环删除逻辑被推送到代码中。

【讨论】:

【参考方案2】:

我在树视图上遇到了类似的问题。这是一个对我有用的删除代码: (我将 id 保存到 value 属性中,并使用实体模型框架删除) 也许可以帮助某人

private void removeRecursive(TreeNode parentToDelete)
    
        foreach (TreeNode tn in parentToDelete.ChildNodes)
            removeRecursive(tn);

        long id = long.Parse(parentToDelete.Value);
        Category deleteCat = context.Categories.Single(x => x.Id ==id);
        context.Categories.DeleteObject(deleteCat);
    

PD 对不起我的英语太糟糕了......

【讨论】:

以上是关于同一张表之间多对多的级联删除的主要内容,如果未能解决你的问题,请参考以下文章

休眠 - 多对多关系中的级联删除

hibernate多对多双向关系映射的级联配置

没有级联删除目标的级联删除关系

mybatis实战教程三:多对多关联

Mybatis 多对多(易百教程)

15.翻译系列:EF 6中的级联删除EF 6 Code-First 系列