我有一大堆带有几个嵌套循环的代码,需要最终更新数据库中的许多记录。我试图最小化对Entity Framework的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循环中使用Save()以便所有“obj”实例都能保持不变。或者DbSet.Attach(obj)是否确保每个实例都得到更新,无论我对循环中的对象做了什么。
或许更好的方式是:
鉴于它看起来像Attach()是传递引用所以因此只有我的最后一个obj将被更新,EF的最佳实践是什么来完成这种事情(不包括直接调用的选项) SQL)?
答案 0 :(得分:0)
我认为你不必担心。在您的对象上调用Attach
后,您是否自己保留对它的引用并不重要;应该没问题。
要记住的是,您的对象的存在时间与某人引用的一样长。因此,有理由认为调用Attach
会导致您的DbSet
引用您的对象,因此即使您不再自己引用它,也要保持它的存在。
但是,在我看来,最好的办法是试一试,看看会发生什么!