.NET EntityFramework:"在提供程序连接上启动事务时发生错误.有关详细信息,请参阅内部异常"

CWi*_*nKY 8 .net entity-framework

在.NET中使用Entity Framework我想循环遍历从数据库返回的项目列表并进行更新.

var qry = (from c in DBEntities.Customer select c);
foreach (Object item in qry)
{
  item.FirstName = .... 
  ... etc, other code here
  DBEntities.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

根据:http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/8a337036-d288-48d4-80d4-89e5a51eddd9?ppud =4 S Hargroves建议转换为IList,这就是解决方案.

没试过,我相信它会起作用,但即使它有效,我想知道为什么我不能在循环期间更新项目?这是在我的本地开发环境中发生的,没有其他用户访问数据库.

谢谢 ...

Til*_*dor 11

使用查询上的SaveChanges更新数据库时,查询无效.您执行的更新可能已更改结果集.

通过使用ToList,您将触发查询的执行并将数据库中的所有结果带入内存.您的内存列表现在已经具体,不再关注查询了.

因为对象查询使用IEnumerable,所以不能在foreach中修改列表.

我也相信这段代码会因为同样的基本原因而失败:

List<int> numbers = new List<int>() { 1,2,3,4,5,6};
foreach(var num in numbers)
  numbers.Remove(num); //Invalidates the Enumerator being used in the foreach
Run Code Online (Sandbox Code Playgroud)


awr*_*t18 3

我同意将 var 制作为列表。然后在 foreach 中,不要使用 qry 中的 Object item,而是使用 qry 中的 Customer customer。在这种情况下,您真正​​处理的是客户对象而不仅仅是对象。在大多数情况下,您不想在 foreach 中调用 SaveChanges(),因为每次执行时都会在服务器上执行更新命令。如果您在 foreach 之后执行此操作,它将对数据库进行一批调用,并且执行得更好。

我建议的伪代码看起来像

var customers = (from c in DBEntities.Customer select c).ToList<Customer>();
foreach (Customer customer item in customers)
{
  customer.FirstName = .... 
  ... etc, other code here

}
DBEntities.SaveChanges();
Run Code Online (Sandbox Code Playgroud)