0

使用对象上下文。我想通过 ExecuteStoreCommand 传递一个 SQL 查询来做到这一点,因为我不想仅仅为了在之后删除它们而检索所有相关实体。

类别表如下:

CatID | CatName | ParentID

其中 CatID 是 ParentID FK 的主键

我希望删除一个类别以及该类别下的所有类别。可以是 2+ 级别的子猫,所以不同的 ParentID

以为我可以按如下方式进行操作,只需在数据库中的外键的删除选项上设置“级联”,但它不会让我,而且它似乎不想通过使用 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");
}
4

2 回答 2

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

于 2012-05-22T12:58:11.300 回答
0

为什么不在批处理中发送两个语句?

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

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

于 2012-05-22T12:39:51.143 回答