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/

posted @ 2022-02-21 16:15  码上的飞鱼  阅读(431)  评论(0编辑  收藏  举报