在实体框架代码第一种方法中 - 执行Updaterange()

时间:2016-07-14 21:41:25

标签: entity-framework

我需要对Model对象列表执行更新操作。 截至目前,我可以在循环播放时进行更新。

*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;
 }
 }
 }*

有没有直接的方法可以更新List而不循环使用它们?

1 个答案:

答案 0 :(得分:1)

您正在寻找的是批量操作。实体框架不适合批量操作。随着EF必须跟踪的变化次数增加,性能会下降。

有一些可能的解决方法:

  1. 在您枚举要更新的列表时,按时间间隔提交更改。在上下文中插入或更新了1000多个项目后,即SaveChanges

  2. EF跟踪的项目越多,EF就越难运作。选项1可以缓解部分问题,但您也可以禁用跟踪。公平警告,有一些问题,因此请务必阅读禁用变更检测时必须考虑的所有事项。

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

  4. 注意:选项1中的1000个项目是任意数字。如果选择这条路线,则应运行测试以查看哪个范围最适合您正在使用的对象。

    你会发现:

    • 大小listSize
    • 的列表
    • 1到n
    • 之间的数字listSize

    SaveChanges个项目之后调用n比在每个项目之后调用SaveChanges要快得多。如果listSize大约有数万或数十万条更新,则n很可能小于listSize。目标是找到n的值,以便您以最快的速度更新整个列表。