2016-04-26 60 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