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)
我同意将 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)
| 归档时间: |
|
| 查看次数: |
23193 次 |
| 最近记录: |