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

Nic*_*rca 140 c# linq linq-to-entities

关于为什么这可能会破裂的任何想法?

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

我读到问题的解决方法是在foreach循环之前一次性检索结果.

但我不这样做吗?"pp"是我案例中的结果集合

Guf*_*ffa 360

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

使用该ToList方法将枚举器实现为集合.这将读取枚举器中的所有项目并关闭与源的连接,以便您可以将连接用于其他内容.

foreach (var p in pp.ToList())
Run Code Online (Sandbox Code Playgroud)

  • 上帝保佑你@Guffa !!! +1 (17认同)
  • 大!!它也适用于pp.ToArray() (2认同)
  • 里卡多,只要它不是IQueryable就可以工作 (2认同)

Cap*_*chi 10

发生的事情是您使用一个SQL连接迭代一组db实体,然后使用另一个连接来保存更改.发生这种情况是因为您的类基本上与您的数据库连接的一个实例"结合",并且不能被另一个实例更改.

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

当你在它的时候,.ToList()在循环退出后只调用一次以加速代码.