170 похожих чатов

Всем привет! Есть вопрос. У меня есть EF Core. Есть контекст данных. На каждый

вызов я вызываю скоуп с контекстом, проще говоря, для каждой операции свой скоуп, поскольку я знаю, что в одном контексте нельзя параллельные запросы, но в разных контекстах можно.
Я хочу распараллелить это дело по типу (пример просто для наглядности):

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."
________________
И это очень безумно странно, поскольку как так это может быть, если у меня на каждый вызов БД свой контекст? И контексты никак не пересекаются.
Кто может подсказать, куда копать?
Я всё пробовал, вешал локер на порождение экземпляра контекста -- ничего не помогает.
Может ли быть дело в том, что у меня включена (в реальном проекте) ленивая загрузка?

2 ответов

15 просмотров
Ap6ye-Ap6ye Автор вопроса

Ни у кого нет идей, друзья? ;)

Ap6ye-Ap6ye Автор вопроса

Нашёл причину. В общем-то, LazyLoad всему виной. Отключил его, и всё пошло. Я так понимаю, нет способа совместить параллелизм и LazyLoad в EF?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта