• AutoDetectChangesEnabled及AddRange解决EF插入的性能问题


    如果您正在跟踪大量实体在上下文中并调用方法之一很多时候在循环中,然后可能会显著的性能改进通过关闭更改检测循环的持续时间。

    不要忘记重新启用更改检测循环后的,我们使用了 try/finally 来确保始终重新启用即使循环中的代码引发异常。

    System.Text.StringBuilder result = new System.Text.StringBuilder();
            using (Time100Entities db = new Time100Entities())
            {
                var now1 = DateTime.Now.TimeOfDay;
                result.Append(string.Format("<p>{0}开始将数据Add到上下文中</p>", now1));
    
                //方案1:EF默认会自动的跟踪数据的变化,当变更的数据量较大的时候,EF的跟踪工作量就会骤增,指定操作变得缓慢
                db.Configuration.AutoDetectChangesEnabled = false;  //禁用自动检测更改
                db.Configuration.ValidateOnSaveEnabled = false;
    
    
                for (int i = 0; i < 100; i++)
                {
                    EntityModel.F_Order api = new EntityModel.F_Order();
                    api.OrderCode = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff");
                    api.AddTime = DateTime.Now;
                    db.F_Order.Add(api);
                }
    
                //方案2:AddRange解决EF插入的性能问题
                //List<EntityModel.F_Order> orderList = new List<EntityModel.F_Order>();
                //db.F_Order.AddRange(orderList);
    
                var now2 = DateTime.Now.TimeOfDay;
                result.Append(string.Format("<p>{0}数据Added完毕,开始执行Insert操作,耗时{1}</p>", now2, now2 - now1));
                result.Append(string.Format("<p>AutoDetectChangesEnabled 状态:{0}</p>", db.Configuration.AutoDetectChangesEnabled));
                try
                {
                    db.SaveChanges();
                }
                finally
                {
                    db.Configuration.AutoDetectChangesEnabled = true;
                    db.Configuration.ValidateOnSaveEnabled = true;
                }
    
                var now3 = DateTime.Now.TimeOfDay;
                result.Append(string.Format("<p>{0}Insert完毕,耗时{1}</p>", now3, now3 - now2));
    
                Response.Write(result);
            }

    官网说明:https://docs.microsoft.com/zh-cn/ef/ef6/saving/change-tracking/auto-detect-changes

  • 相关阅读:
    面试-Hash是怎么实现的?
    教程-在Delphi中怎么查看是否有内存泄漏(Delphi2007)+WIN7
    面试-SizeOf一个对象会得到什么?
    Unity-Animator深入系列---录制与回放
    Animation.Sample用法介绍
    Unity-Animator深入系列---StateMachineBehaviour状态机脚本学习
    Unity-Animator深入系列---deltaPosition&deltaRotation
    Unity-Animato深入系列---FloatValue阻尼
    Animation在每一帧中的执行顺序测试
    Unity脚本在层级面板中的执行顺序测试2
  • 原文地址:https://www.cnblogs.com/Fooo/p/10984897.html
Copyright © 2020-2023  润新知