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 ответов

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

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

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

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
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
Карта сайта