我有大量实体,例如10k个实体都已更新。我需要一种快速的方法来改变状态并最终将它们提交到数据库。
BaseOtiveContext.Entry(Entity).State = EntityState.Modified;
对于批量插入,我可以通过添加范围轻松实现非常快速的结果。
BaseOtiveContext.Contacts.AddRange(Entities)
我为更新的实体尝试了并行处理,但是当修改集合中的对象时,它会抛出错误。
我需要一种方法来做到这一点:
BaseOtiveContext.Contacts.AddRange(Entities)
但同时将状态更改为
.State = EntityState.Modified;
答案 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)。