我有一个具有类别层次结构的数据库。每个类别都有一个parentcategoryid。我调用以下函数以加载顶级类别,然后递归调用自身以加载所有子项。
但是,出现以下错误:
SqlException:不允许新事务,因为还有其他事务 会话中运行的线程。
public async Task LoadCategoriesAsync()
{
await LoadCategoriesByParentId(null);
}
private async Task LoadCategoriesByParentId(int? sourceParentId, int? parentId)
{
var sourceCategories = _dbContext.SourceCategory.Where(c => c.ParentCategoryId == sourceParentId);
foreach (var sourceCategory in sourceCategories)
{
var newCategory = new Category()
{
Name = sourceCategory.Name,
Description = sourceCategory.Description,
ParentCategoryId = parentId
};
_dbContext.Category.Add(newCategory);
await _dbContext.SaveChangesAsync();
//category.EntityId = newCategory.Id;
//_dbContext.SourceCategory.Update(category);
//await _dbContext.SaveChangesAsync();
await LoadCategoriesByParentId(sourceCategory.CategoryId, newCategory.Id);
}
}
答案 0 :(得分:0)
您的Where()
语句未检索到数据;只是“打开游标”(用旧的说法)。因此,您无法执行SaveChange()
。最简单的解决方案是将IEnumerable
转换为List
或Array
:
var rootCategories = _dbContext.SourceCategory.Where(c => c.ParentCategoryId == parentId).ToList();
但我强烈建议您使用Google搜索该错误并了解其原因。递归执行此操作乞求以解决问题