EF优化 - AutoDetectChangesEnabled
当批量添加修改数据时,EF同步到上下文这个阶段比较耗时。
出现这个问题的原因是:每次调用Add、Update之前,EF都会调用DetectChanges,当调用DetectChanges方法时,会扫描上下中所有实体并将当前值和快照中的值进行比较,然后作出相关的行为。
微软官方给出的介绍是:获取或设置一个值,该值指示是否通过 DbContext 和相关类的方法自动调用 DetectChanges() 方法。 默认值为 true。
for (int i = 0; i < itemList.Count; i++) { T t = itemList[i]; if (t == null) throw new ArgumentNullException("entity"); this.Entities.Attach(t); this._context.Entry<T>(t).State = EntityState.Modified; } return this._context.SaveChanges();
上面是我开始写的代码,由于是批量操作数据,一万多条数据循环操作竟然花了十多分钟。
下面是我修改过后的代码
_context.Configuration.AutoDetectChangesEnabled = false; for (int i = 0; i < itemList.Count; i++) { T t = itemList[i]; if (t == null) throw new ArgumentNullException("entity"); this.Entities.Attach(t); this._context.Entry<T>(t).State = EntityState.Modified; } _context.Configuration.AutoDetectChangesEnabled = true; return this._context.SaveChanges();
通过把_context.Configuration.AutoDetectChangesEnabled 设为 false来控制对数据进行添加修改时不再调用调用DetectChanges方法,再进行数据操作一下就执行完成了。但是在保存之前必须把_context.Configuration.AutoDetectChangesEnabled 设为 true,不然无法同步所有状态,无法保存成功。
文章转载自:快速开发平台
地址:https://www.hocode.com/