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

时间:2012-11-02 11:02:36

标签: sql sql-server sql-server-ce cascade

我正在尝试在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(所以没有存储过程)?或者有更好的方法来模拟这种关系吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我在树视图中遇到了类似的问题。这是一个对我有用的删除代码: (我将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);
    }
对不起我的英语很糟糕......