2016-04-26 56 views
0

我有大量的實體,例如10k實體已全部更新。我需要一種快速的方式來改變狀態並最終將它們提交給數據庫。在實體框架中爲實體設置狀態的最快方法 sqlite

BaseOtiveContext.Entry(Entity).State = EntityState.Modified; 

對於批量插入,我可以通過添加範圍輕鬆實現非常快的結果。

BaseOtiveContext.Contacts.AddRange(Entities) 

我嘗試並行爲更新的實體的每個,但它會引發錯誤,因爲集合中的對象被修改。

我需要一種方法來做到這一點:

BaseOtiveContext.Contacts.AddRange(Entities) 

,但在同一時間將狀態更改爲

.State = EntityState.Modified; 

回答

1

解決了我的問題,通過以下方式:

 using (DbContextTransaction txUpdate = dbUpdate.Database.BeginTransaction()) 
     { 
      dbUpdate.Configuration.AutoDetectChangesEnabled = false; 
      foreach(var Item in UpdateItems) 
      { 
       dbUpdate.Entry<V2Contact>(Item).State = EntityState.Modified; 
      } 
      dbUpdate.Configuration.AutoDetectChangesEnabled = true; 
      dbUpdate.ChangeTracker.DetectChanges(); 
      dbUpdate.SaveChanges(); 
      txUpdate.Commit(); 
     } 

的第一件事是禁用更改跟蹤,然後更改每個對象的狀態更新。當更改跟蹤被禁用時,更改狀態操作將會很快發生,一旦完成將其重新打開並最終調用檢測更改,保存並提交

0

優化並行的線程數量計數(N)主要取決於你的CPU 。將對象集合拆分爲(N)組,以便每個線程只處理屬於它的對象。所有線程完成後,調用Commit(SaveChanges)。

+0

問題是集合中的對象被修改。拆分成單獨的組仍然存在同樣的問題。這個問題與平行線程本身無關,而更多的與改變實體狀態的本質有關。 – CodeMilian