我有一大块代码,其中包含几个嵌套循环,最终需要更新数据库中的许多记录。我正在尝试尽量减少对实体框架的 SaveChanges() 调用次数。另请注意,我们正在使用存储库模式。
本质上,我正在迭代一个集合,需要更新集合中的项目,并且在每次迭代时,从数据库中检索另一个对象并由集合中的项目进行上下文化。
示例代码:
foreach (var outer in outerList)
{
obj = unit.GetRepository<MyObj>().Get(s =>
s.id = myId
).SingleOrDefault();
obj.value += outer.value;
outer.objId = obj.objId;
unit.GetRepository<MyOuterObj>().Update(outerObj);
unit.GetRepository<MyObj>().Update(obj);
}
unit.Save();
对 Update() 的调用执行以下操作:
public virtual void Update(T entityToUpdate)
{
if(entityToUpdate is AuditModelBase)
{
var model = entityToUpdate as AuditModelBase;
model.UpdatedAt = DateTime.UtcNow;
}
DbSet.Attach(entityToUpdate);
Context.Entry(entityToUpdate).State = EntityState.Modified;
}
对 Save() 的调用当然会执行以下操作:
_context.SaveChanges();
所以我的问题是,当我每次通过循环将 obj 重新分配给不同的值时,我是否需要在 foreach 循环中保存()才能使“obj”的所有实例持续存在。或者 DbSet.Attach(obj) 是否确保更新每个单独的实例,无论我对循环中的对象做什么。
或者也许更好的方法是:
鉴于 Attach() 看起来是通过引用传递的,因此只有我的最后一个 obj 将被更新,EF 完成此类事情的最佳实践是什么(不包括直接调用 SQL 的选项)?