2016-04-26 8 views
0

私は、すべてが更新された例えば10k個のエンティティのような多数のエンティティを持っています。状態を変更し、最終的にはデータベースにコミットするための速い方法が必要です。エンティティフレームワーク sqliteのエンティティの状態を変更する最速の方法

バルクインサートの場合、範囲を追加すると非常に高速な結果が簡単に得られます。

BaseOtiveContext.Contacts.AddRange(Entities) 

更新されたエンティティごとにそれぞれを試しましたが、コレクション内のオブジェクトが変更されるとエラーが発生します。

私はこれを行うための方法が必要です。

BaseOtiveContext.Contacts.AddRange(Entities) 

をしかし同時に、最適な並列スレッドの数は、(N)をカウント

.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

に状態を変更するには、あなたのCPUにほとんど依存します。オブジェクトのコレクションを(N)グループに分割すると、各スレッドはそれに属するオブジェクトのみを処理します。すべてのスレッドが完了したら、Commit(SaveChanges)を呼び出します。

+0

コレクション内のオブジェクトが変更されるという問題があります。別々のグループに分割する場合でも、同じ問題が発生します。この問題は、並列スレッド自体とは関係ありませんが、エンティティの状態を変更する性質があります。 – CodeMilian