实体框架核心:不允许新事务,因为会话中有其他线程在运行

时间:2019-05-06 04:16:57

标签: asp.net-core entity-framework-core

我有一个具有类别层次结构的数据库。每个类别都有一个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);
        }
    }

1 个答案:

答案 0 :(得分:0)

您的Where()语句未检索到数据;只是“打开游标”(用旧的说法)。因此,您无法执行SaveChange()。最简单的解决方案是将IEnumerable转换为ListArray

var rootCategories = _dbContext.SourceCategory.Where(c => c.ParentCategoryId == parentId).ToList();

但我强烈建议您使用Google搜索该错误并了解其原因。递归执行此操作乞求以解决问题