вызов я вызываю скоуп с контекстом, проще говоря, для каждой операции свой скоуп, поскольку я знаю, что в одном контексте нельзя параллельные запросы, но в разных контекстах можно.
Я хочу распараллелить это дело по типу (пример просто для наглядности):
Task<FirstEntity> firstTask;
Task<SecondEntity> secondTask;
using (IDbService dbService = new DbService(_db).DbServiceInstance)
firstTask = dbService.FirstEntities.GetFromDb(firstId);
using (IDbService dbService = new DbService(_db).DbServiceInstance)
secondTask = dbService.SecondEntities.GetSecondFromDb(secondId);
await Task.WhenAll(firstTask, secondTask);
var f = firstTask.Result;
var s = secondTask.Result;
Внутри методы обращения выглядят примерно так (в реальности сложнее, там трай-кетчи и всё такое, но для примера не важно):
public async Task<FirstEntity> GetFirstFromDb(int id) => await _db.FirstEntities.FindAsync(id);
public async Task<SecondEntity> GetSecondFromDb(int id) => await _db.SecondEntitites.FindAsync(id);
И вот код выполняется, проходит первый скоуп (успешно получает firstTask), контекст успешно диспоузится, начинается второй скоуп, и на попытке выполнить метод GetSecondFromDb() возникает ексепшн:
________________
"A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext, however instance members are not guaranteed to be thread safe. This could also be caused by a nested query being evaluated on the client, if this is the case rewrite the query avoiding nested invocations."
________________
И это очень безумно странно, поскольку как так это может быть, если у меня на каждый вызов БД свой контекст? И контексты никак не пересекаются.
Кто может подсказать, куда копать?
Я всё пробовал, вешал локер на порождение экземпляра контекста -- ничего не помогает.
Может ли быть дело в том, что у меня включена (в реальном проекте) ленивая загрузка?
Ни у кого нет идей, друзья? ;)
Нашёл причину. В общем-то, LazyLoad всему виной. Отключил его, и всё пошло. Я так понимаю, нет способа совместить параллелизм и LazyLoad в EF?
Обсуждают сегодня