Entity Framework Core: ошибка «Вторая операция началась до завершения предыдущей»C#

Место общения программистов C#
Ответить
Anonymous
 Entity Framework Core: ошибка «Вторая операция началась до завершения предыдущей»

Сообщение Anonymous »

У меня проблема с API, который должен получать аналитику по большинству выигранных испытаний в системе геймификации. Он должен получить данные о трех лучших выигранных испытаниях в зависимости от того, сколько разных пользователей прошли этап в этом задании. Это мой запрос, который вызывает ошибку

Код: Выделить всё

var topChallenges = await ChallengeRepository.GetAllAsQueryable()
.Where(c =>
c.ChallengeStatus != ChallengeStatusEnum.Draft &&
(!request.Data.MainDate.From.HasValue || c.StartDate >= request.Data.MainDate.From) &&
(!request.Data.MainDate.To.HasValue || c.EndDate  request.Data.Segments.Select(x => x.Value).Contains(s.Value)))
)
.OrderByDescending(c => c.Milestones.Select(m => m.UserId).Distinct().Count())
.Take(3)
.Select(c => new
{
c,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count(),
Name = c.ChallengeResources
.Where(r => r.SupportedLanguageId == Language.Id)
.Select(r => r.Name)
.FirstOrDefault(),
ImagePath = c.ChallengeImages
.OrderBy(ci => ci.Id)
.Select(ci => ci.Image)
.FirstOrDefault()
})
.AsNoTracking()
.ToListAsync();
затем я попытался улучшить его, не выполняя один и тот же расчет количества пользователей дважды одновременно
и попробовал этот подход

Код: Выделить всё

var filteredChallenges = await ChallengeRepository.GetAllAsQueryable()
.Where(c =>
c.ChallengeStatus != ChallengeStatusEnum.Draft &&
(!request.Data.MainDate.From.HasValue || c.StartDate >= request.Data.MainDate.From) &&
(!request.Data.MainDate.To.HasValue || c.EndDate  request.Data.Segments.Select(x => x.Value).Contains(s.Value)))
)
.Select(c => new
{
c.Id,
c.ChallengeStatus,
c.StartDate,
c.EndDate,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count(),
Name = c.ChallengeResources
.Where(r => r.SupportedLanguageId == Language.Id)
.Select(r => r.Name)
.FirstOrDefault(),
ImagePath = c.ChallengeImages
.OrderBy(ci => ci.Id)
.Select(ci => ci.Image)
.FirstOrDefault()
})
.AsNoTracking()
.ToListAsync();

var topChallenges = filteredChallenges
.OrderByDescending(c => c.DistinctUserCount)
.Take(3)
.ToList();
затем я попробовал другой подход, чтобы удалить .Include(c => c.milestones)
и полностью разделить вычисления на разные этапы, используя этот подход

Код: Выделить всё

var challengeIdsWithCounts = await ChallengeRepository.GetAllAsQueryable()
.Where(c =>
c.ChallengeStatus != ChallengeStatusEnum.Draft &&
(!request.Data.MainDate.From.HasValue || c.StartDate >= request.Data.MainDate.From) &&
(!request.Data.MainDate.To.HasValue || c.EndDate  request.Data.Segments.Select(x => x.Value).Contains(s.Value)))
)
.Select(c => new
{
ChallengeId = c.Id,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count() // Database does the counting
})
.AsNoTracking()
.ToListAsync();

var topChallengeIds = challengeIdsWithCounts
.OrderByDescending(c => c.DistinctUserCount)
.Take(3)
.Select(c => c.ChallengeId)
.ToList();

var topChallenges = await ChallengeRepository.GetAllAsQueryable()
.Where(c =>  topChallengeIds.Contains(c.Id))
.Select(c => new
{
c.Id,
c.ChallengeStatus,
c.StartDate,
c.EndDate,
DistinctUserCount = c.Milestones.Select(m => m.UserId).Distinct().Count(),
Name = c.ChallengeResources
.Where(r => r.SupportedLanguageId == Language.Id)
.Select(r => r.Name)
.FirstOrDefault(),
ImagePath = c.ChallengeImages
.OrderBy(ci => ci.Id)
.Select(ci => ci.Image)
.FirstOrDefault()
})
.AsNoTracking()
.ToListAsync();

topChallenges = topChallenges
.OrderByDescending(c => c.DistinctUserCount)
.ToList();
и во всех трех подходах я продолжаю получать эту ошибку.
Что-то пошло не так. Вторая операция была запущена в этом экземпляре контекста до завершения предыдущей операции. Обычно это вызвано тем, что разные потоки одновременно используют один и тот же экземпляр DbContext. Дополнительные сведения о том, как избежать проблем с потоками с помощью DbContext, см. на странице https://go.microsoft.com/fwlink/?linkid=2097913. SourceContext: (Dsquares.Logging.Middleware.Request_Respons_Middleware)
Я даже проверил ссылку о том, как избежать проблем с потоками в Microsoft, но до сих пор не могу понять, в чем проблема? также мой контекст базы данных зарегистрирован как ограниченный, а не одноэлементный

Подробнее здесь: https://stackoverflow.com/questions/798 ... leted-erro
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»