我有非常基本的类别模型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);
}
答案 0 :(得分:2)
您将DataReader
声明暂停childrenCategories
。
除了异常之外,它意味着您正在执行两次查询 - 一次获取计数,然后再次获取数据。
这应解决问题:
var childrenCategories = _db.Categories
.Where(x => x.RootCategory.ID == id)
.ToList()
;
执行SQL语句并将所有记录具体化为List
。
因此,您将数据保存在内存中,DataReader
已完成。
答案 1 :(得分:1)
我相信你的问题是你在foreach
循环期间试图破坏协作,这是不可能做到的。
尝试创建要删除的项目列表,然后使用一个
删除它们_db.Remove(itemsToRemove).
那会为你做法。