C # Запись в базу данных в асинхронном цикле ForEach - PullRequest
0 голосов
/ 02 января 2019

В моей базе данных есть таблица устройств, EF создал модель этой таблицы в моем проекте.У меня есть список строк, называемых элементами, мне нужно выполнить асинхронный цикл по этим элементам и выполнить проверку, а затем на основе результатов обновить свойства объекта устройств, начиная с каждой итерации, я создаю свежий экземпляр модели устройств, после подготовки нужного мне объекта устройств.запросить таблицу устройств в моей базе данных, чтобы иметь все записи одного и того же элемента, а затем обновить их все на основе нового объекта.когда я пытаюсь запросить таблицу устройств в моей базе данных, я получаю это исключение

System.InvalidOperationException: «Контекст не может использоваться во время создания модели.Это исключение может быть вызвано, если контекст используется внутри метода OnModelCreating или если к одному и тому же экземпляру контекста обращаются одновременно несколько потоков.Обратите внимание, что члены экземпляра DbContext и связанных классов не гарантируют поточно-ориентированную защиту. '

вот мой поток кода

static async void Begin(List<string> elements)
{
ParalelForEach(elements, element => {

devices devObj = new devices();
//here i do my operation on element and update devObj object
// now in below i should query my device table in my database to collect all records of same element so I can update them based on new devObj i created but above Exception thrown

var dbElementsList = dbContext.devices.Where(e =>e.name == element).Tolist();//Exception is thrown here

foreach(var dbe in dbElementsList)
{
//update process happens here on dbe
}
dbContext.devices.Add(devObj);
dbContext.SaveChanges();

}):
}

1 Ответ

0 голосов
/ 02 января 2019

DbContext не является потокобезопасным. Он использует одно соединение с базой данных, и вы не должны обращаться к одному экземпляру соединения из нескольких потоков (есть исключения для особых типов соединений, но лучше предположить, что вы не должны и не должны).

Чтобы распараллелить вызовы к БД, вам нужно создать новый экземпляр DbContext в теле Parallel.ForEach.

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