2016-07-14 66 views
0

我需要在模型對象列表上執行更新操作。 截至目前,我可以通過循環來更新它們。在實體框架中的代碼優先方法 - 執行Updaterange()

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

是否有任何直接的方式我可以更新列表沒有循環他們?

+1

*沒有循環通過它們*爲什麼? –

+0

不,沒有。你如何修改一些條目而不循環它們?如果您在條目附加到啓用了ChangeTracking的上下文時執行此操作,則您甚至不必將它們設置爲之後修改。如果在再次添加它們之前將它們從上下文中分離出來......當然,您必須告知EF如何處理上下文中的對象,它不能僅僅猜測要插入哪個對象以及要更新哪個對象。 – DevilSuichiro

+0

另一個「通過」和我「穿過」你「穿過」窗口:-) – peterh

回答

1

看起來你正在尋找的是批量操作。實體框架不適合批量操作。隨着EF跟蹤的變化數量的增加,性能下降。

有一些可能的變通:

  1. ,你通過,你要更新列表中列舉提交的區間更改。即SaveChanges在上下文中插入或更新了1000個項目後。

  2. EF跟蹤的項目越多,EF越難以工作。其中一部分由選項1緩解,但您也可以禁用跟蹤。公平的警告,這裏有一些捕獲,所以一定要讀取禁用更改檢測時必須考慮的一切。

  3. 如果您的進程需要大量更改,那麼使用存儲過程可能比EF更好。

注意:選項一中的1000項是一個任意數字。如果您選擇走這條路線,您應該運行測試來查看您正在使用的對象的最佳範圍。

什麼,你會發現是:

  • 大小的列表listSize
  • 1和listSize

之間的數字n它的速度更快後n項目數比打電話SaveChanges每個項目後調用SaveChanges。如果listSize的數量級爲數萬或數十萬次,則n最可能小於listSize。目標是找到n的值,這將允許您以最快的速度更新整個列表。