AutoDetectChangesEnabled及AddRange解決EF插入的性能問題

若是您正在跟蹤大量實體在上下文中並調用方法之一不少時候在循環中,而後可能會顯著的性能改進經過關閉更改檢測循環的持續時間。api

不要忘記從新啓用更改檢測循環後的,咱們使用了 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-changesui

相關文章
相關標籤/搜索