新的事务是不允许的,因为会话中有其他线程正在运行LINQ To Entity

任何想法,为什么这可能会打破?

foreach (var p in pp) { ProjectFiles projectFile = (ProjectFiles)p; projectFile.Status = Constants.ProjectFiles_ERROR; projectFile.DateLastUpdated = DateTime.Now; context.SaveChanges(); } 

我读过这个问题的解决方法,是在foreach循环之前一次检索结果。

但我没有那样做? “pp”是我收集的结果

ppvariables不是对象的集合,它是一个可以返回对象的枚举器。 在使用枚举器时,源必须保持打开状态。

使用ToList方法将枚举器实现为集合。 这将读取枚举器中的所有项目,并closures到源的连接,以便您可以使用连接来处理其他事情。

 foreach (var p in pp.ToList()) 

发生什么事是你使用一个SQL连接来遍历数据库实体的集合,然后使用另一个连接来保存更改。 发生这种情况是因为你的类基本上已经“结婚”到你的数据库连接的一个实例,不能被另一个实例改变。

解决这个问题的方法是在迭代之前调用集合上的.ToList()。

而当你在它的时候,循环退出后只调用一次context.SaveChages()来加速代码。