2016-07-14 128 views
0

我需要在模型对象列表上执行更新操作。 截至目前,我可以通过循环来更新它们。在实体框架中的代码优先方法 - 执行Updaterange()

*public virtual void UpdateList(List<TEntity> entity) 
{ 
foreach (TEntity ent in entity) 
{ 
if (Entities.Any(h=>h.Id == ent.Id)) 
{ 
Entities.Attach(ent); 
_context.Entry(ent).State = EntityState.Modified; 
} 
} 
}* 

是否有任何直接的方式我可以更新列表没有循环他们?

+1

*没有循环通过它们*为什么? –

+0

不,没有。你如何修改一些条目而不循环它们?如果您在条目附加到启用了ChangeTracking的上下文时执行此操作,则您甚至不必将它们设置为之后修改。如果在再次添加它们之前将它们从上下文中分离出来......当然,您必须告知EF如何处理上下文中的对象,它不能仅仅猜测要插入哪个对象以及要更新哪个对象。 – DevilSuichiro

+0

另一个“通过”和我“穿过”你“穿过”窗口:-) – peterh

回答

1

看起来你正在寻找的是批量操作。实体框架不适合批量操作。随着EF跟踪的变化数量的增加,性能下降。

有一些可能的变通:

  1. ,你通过,你要更新列表中列举提交的区间更改。即SaveChanges在上下文中插入或更新了1000个项目后。

  2. EF跟踪的项目越多,EF越难以工作。其中一部分由选项1缓解,但您也可以禁用跟踪。公平的警告,这里有一些捕获,所以一定要读取禁用更改检测时必须考虑的一切。

  3. 如果您的进程需要大量更改,那么使用存储过程可能比EF更好。

注意:选项一中的1000项是一个任意数字。如果您选择走这条路线,您应该运行测试来查看您正在使用的对象的最佳范围。

什么,你会发现是:

  • 大小的列表listSize
  • 1和listSize

之间的数字n它的速度更快后n项目数比打电话SaveChanges每个项目后调用SaveChanges。如果listSize的数量级为数万或数十万次,则n最可能小于listSize。目标是找到n的值,这将允许您以最快的速度更新整个列表。