C#在异步ForEach循环中写入数据库

C#在异步ForEach循环中写入数据库,c#,asp.net-mvc,asynchronous,C#,Asp.net Mvc,Asynchronous,我的数据库中有一个名为devices的表,EF在我的项目中创建了该表的模型。我有一个名为元素的字符串列表,我需要通过这些元素进行异步循环,并进行检查,然后根据结果更新设备对象的属性,在每次迭代开始时,我创建新的设备模型实例,准备好devices对象后,我需要在数据库中查询我的devices表,以获得相同元素的所有记录,然后根据新对象更新所有记录。当我试图在我的数据库中查询我的设备表时,我收到了这个异常 System.InvalidOperationException:'在创建模型时无法使用上下文

我的数据库中有一个名为devices的表,EF在我的项目中创建了该表的模型。我有一个名为元素的字符串列表,我需要通过这些元素进行异步循环,并进行检查,然后根据结果更新设备对象的属性,在每次迭代开始时,我创建新的设备模型实例,准备好devices对象后,我需要在数据库中查询我的devices表,以获得相同元素的所有记录,然后根据新对象更新所有记录。当我试图在我的数据库中查询我的设备表时,我收到了这个异常

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();

}):
}
static async void Begin(列出元素)
{
Paralleforeach(元素,元素=>{
devices devObj=新设备();
//在这里,我对元素执行操作并更新devObj对象
//现在在下面,我应该在我的数据库中查询我的设备表,以收集相同元素的所有记录,这样我就可以根据我创建的新devObj更新它们,但上面抛出了异常
var dbElementsList=dbContext.devices.Where(e=>e.name==element.Tolist();//此处引发异常
foreach(dbElementsList中的变量dbe)
{
//更新过程在dbe上发生
}
dbContext.devices.Add(devObj);
dbContext.SaveChanges();
}):
}

DbContext不是线程安全的。它使用到数据库的单个连接,您不应该从多个线程访问单个连接实例(特殊类型的连接有例外,但最好假设您不应该也不应该)


要并行化对数据库的调用,需要在
Parallel的主体中创建一个新的DbContext实例。ForEach

DbContext不是线程安全的。它使用到数据库的单个连接,您不应该从多个线程访问单个连接实例(特殊类型的连接有例外,但最好假设您不应该也不应该)


要并行化对db的调用,您需要在
Parallel.ForEach

的主体中创建一个新的DbContext实例。这个问题的答案可能对您有用:这个问题的答案可能对您有用:您能详细说明一下吗@NickCaveat:如果集合很大,则每个执行线程的新DbContext可能无法很好地扩展,并且可能仍会在数据库中遇到表锁。因为它会在同一位置引发另一个错误“目标主体名称不正确。无法生成SSPI上下文”。请详细说明@NickCaveat:如果集合很大,则每个执行线程的新DbContext可能无法很好地扩展,并且可能仍会在数据库中遇到表锁。因为它会在同一位置引发另一个错误:“目标主体名称不正确。无法生成SSPI上下文。”