我需要对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而不循环使用它们?
答案 0 :(得分:1)
您正在寻找的是批量操作。实体框架不适合批量操作。随着EF必须跟踪的变化次数增加,性能会下降。
有一些可能的解决方法:
在您枚举要更新的列表时,按时间间隔提交更改。在上下文中插入或更新了1000多个项目后,即SaveChanges
。
EF跟踪的项目越多,EF就越难运作。选项1可以缓解部分问题,但您也可以禁用跟踪。公平警告,有一些问题,因此请务必阅读禁用变更检测时必须考虑的所有事项。
如果您的流程需要进行大量更改,那么使用存储过程可能比使用EF更好。
注意:选项1中的1000个项目是任意数字。如果选择这条路线,则应运行测试以查看哪个范围最适合您正在使用的对象。
你会发现:
listSize
n
listSize
在SaveChanges
个项目之后调用n
比在每个项目之后调用SaveChanges
要快得多。如果listSize
大约有数万或数十万条更新,则n
很可能小于listSize
。目标是找到n
的值,以便您以最快的速度更新整个列表。