在实体框架\ sqlite中为实体设置修改状态的最快方法

时间:2016-04-26 20:00:58

标签: c# entity-framework sqlite

我有大量实体,例如10k个实体都已更新。我需要一种快速的方法来改变状态并最终将它们提交到数据库。

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

对于批量插入,我可以通过添加范围轻松实现非常快速的结果。

BaseOtiveContext.Contacts.AddRange(Entities)

我为更新的实体尝试了并行处理,但是当修改集合中的对象时,它会抛出错误。

我需要一种方法来做到这一点:

BaseOtiveContext.Contacts.AddRange(Entities)

但同时将状态更改为

   .State = EntityState.Modified;

2 个答案:

答案 0 :(得分:4)

通过以下方式解决了我的问题:

      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();
        }

首先要禁用更改跟踪,然后更改要更新的每个对象的状态。更改状态操作将在禁用更改跟踪时快速发生,一旦完成重新打开并最终调用检测更改,保存并提交

答案 1 :(得分:0)

最佳并行线程数(N)主要取决于您的CPU。将对象集合拆分为(N)组,然后每个线程将只处理属于它的对象。完成所有线程后,调用Commit(SaveChanges)。