Entity Framework Core: новая транзакция не разрешена, так как в сеансе запущены другие потоки - PullRequest
0 голосов
/ 06 мая 2019

У меня есть база данных с иерархией категорий. У каждой категории есть 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 голосов
/ 06 мая 2019

Ваш оператор Where() не получает данные;просто "открывает курсор" (по-старому).Итак, вы не можете сделать SaveChange().Самое простое решение - конвертировать IEnumerable в List или Array:

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

Но я настоятельно рекомендую вам погуглить ошибку и понять, почему это происходит.Сделать это рекурсивно - это просить о неприятностях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...