我的代碼與幾個嵌套循環大塊這需要在數據庫中更新最終多條記錄。我想盡量減少實體框架的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();
來更新(調用)執行以下操作:
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;
}
而且調用保存()當然下面執行:
_context.SaveChanges();
所以我的問題是,因爲我每次通過循環將obj重新賦值爲不同的值,我是否需要Save() foreach循環以便所有「obj」實例持續存在。或者DbSet.Attach(obj)確保每個單獨的實例都被更新,無論我在循環中如何處理對象。
也許更好的方式來問這個是:
鑑於它看起來像裝()是傳址引用,以便因此只有我最後OBJ將被更新,有什麼用EF最佳實踐完成這種事情(不包括直接調用SQL的選項)?
所以,你寫的所有代碼,但你想知道它是否會奏效。你有沒有考慮過只是執行它並發現? – Servy 2012-07-11 19:56:27
你在問這個問題:「這個特定的代碼段是否工作?」最好通過運行來解決。它只調用一次更新,所以你不會想出任何更少的東西。這個問題是:「這個工作法典是不是很好的做法,還是它可以提高效率?」是代碼審查的問題。 – Servy 2012-07-11 20:37:41