2

我有非常基本的类别模型ID, RootCategoryID, Name,如果我有很多孩子的类别,它不会删除,所以我需要递归地执行此操作,但是当我这样做时会出错。

我知道如果我添加MultipleActiveResultSets=true连接字符串有一种解决方法,但是 AFAIK 这可以从代码中解决,使用此参数不是一个好主意。这是真的?

错误

已经有一个与此命令关联的打开的 DataReader,必须先关闭它。

代码

public ActionResult Delete(int id)
{
    this.DeleteRecursive(id);
    _db.SaveChanges();
    return RedirectToAction("index", "category");
}

private void DeleteRecursive(int id)
{
    // Selecting current category
    var currentCategory = _db.Categories.Where(x => x.ID == id).Single(); // this line
    var childrenCategories = _db.Categories.Where(x => x.RootCategory.ID == id);

    // Check if category has children
    if (childrenCategories.Count() > 0)
    {
        // Loop through children and apply same function recrusively
        foreach (var c in childrenCategories)
        {
            this.DeleteRecursive(c.ID);
        }
    }

    // Category has no children left, delete it
    _db.Categories.Remove(currentCategory);
}
4

2 回答 2

2

您正在DataReaderchildrenCategories声明留空。

除了例外,这意味着您要执行两次查询 - 一次获取计数,然后再次获取数据。

这应该可以解决问题:

var childrenCategories = _db.Categories
  .Where(x => x.RootCategory.ID == id)
  .ToList()
;

这将执行 SQL 语句并将所有记录具体化为List.
所以,你有你的数据在内存中,并且DataReader是完整的。

于 2013-01-14T20:28:00.173 回答
1

我相信您的问题是您试图在foreach循环期间更改排序规则,这是无法完成的。

尝试创建要删除的项目列表,然后用一个将它们全部删除

_db.Remove(itemsToRemove).

那会为你做把戏。

于 2013-01-14T20:26:58.123 回答