删除类别及其子/孙子

时间:2012-05-22 12:24:47

标签: sql sql-server entity-framework

使用ObjectContext。我想通过ExecuteStoreCommand传递一个SQL查询来做到这一点,因为我不想仅仅为了删除它们而想要检索所有相关实体。

“类别”表格如下:

CatID | CatName | ParentID

其中CatID是ParentID FK的主键

我希望删除一个类别以及所有那些类别 在它之下。子猫的深度可以超过2级,所以不同的ParentID

以为我可以按照以下方式执行,只需在删除选项上设置“cascade”即可 对于数据库中的外键,但它不会让我和它似乎不想 通过使用CatID - ParentID关系级联删除并查询获取 被这个非常FK约束所阻止。

public RedirectToRouteResult DelCat(int CatID)
{
    if (CatID != 0)
    {
        _db.ExecuteStoreCommand("DELETE FROM Categories WHERE CatID={0}", CatID);
        _db.SaveChanges();
    }

    return RedirectToAction("CatManage");
}

2 个答案:

答案 0 :(得分:1)

递归CTE allCategories生成层次结构中所有类别的列表。显然,删除部分会将它们全部删除。

; with allCategories as (
 select CatID
   from Categories
  where CatID = @CatID_to_delete
  union all
 select Categories.CatID
   from allCategories
  inner join Categories 
     on allCategories.CatID = Categories.ParentID
)
delete Categories
  from Categories 
 inner join allCategories
    on Categories.CatID = allCategories.CatID

首先尝试使用select * from allCategories进行检查。

TEST @ Sql Fiddle

答案 1 :(得分:0)

为什么不在您的批次中发送两个语句?

DELETE Categories WHERE ParentID = {0};
DELETE Categories WHERE CatID = {0};

如果您正在使用的框架“不允许”这样做,那么请执行此操作:将您的逻辑放在存储过程中,然后调用存储过程。