递归删除类别会引发datareader异常

时间:2013-01-14 20:15:38

标签: c# asp.net-mvc linq entity-framework asp.net-mvc-4

我有非常基本的类别模型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);
}

2 个答案:

答案 0 :(得分:2)

您将DataReader声明暂停childrenCategories

除了异常之外,它意味着您正在执行两次查询 - 一次获取计数,然后再次获取数据。

这应解决问题:

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

执行SQL语句并将所有记录具体化为List
因此,您将数据保存在内存中,DataReader已完成。

答案 1 :(得分:1)

我相信你的问题是你在foreach循环期间试图破坏协作,这是不可能做到的。

尝试创建要删除的项目列表,然后使用一个

删除它们
_db.Remove(itemsToRemove).

那会为你做法。