[C#] 初探Entity Framework (六) – Insert, Bulk Insert

這篇介紹Insert的方法

下圖是範例使用的目標Table: Employees
2016-3-2 下午 05-00-42.png
接著我要Insert “Chris Jheng" 到Employees之中

private void btnInsert_Click(object sender, EventArgs e)
        {
            Employees newOne = new Employees();
            newOne.LastName = "Chris";
            newOne.FirstName = "Jheng";

            ef.Employees.Add(newOne);
            ef.SaveChanges();

            MessageBox.Show("Finish");
        }

成功的結果如下圖
2016-3-2 下午 05-12-56


接下來是關於BulkInsert的問題
由於Entity Framework並沒有MS SQL的DataTable BulkCopy功能
因此必須一個一個Insert進去
而在這樣的狀況下,大量Insert時的效能就很差
範例Code如下

private void btnBulkInsert_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 2000; i++)
            {
                Employees newOne = new Employees();
                newOne.LastName = "Last_" + i.ToString();
                newOne.FirstName = "First_" + i.ToString();

                ef.Employees.Add(newOne);               
            }

            ef.SaveChanges();

            MessageBox.Show("Finish");
        }

測試Insert 2000筆資料,花了大約30秒,效能分析如下圖
2016-3-2 下午 05-41-15.png
效能分析的使用方法,可以參考這篇Performance Analysis
從上圖可以看到效能瓶頸卡在DetectChanges
再查一下Code可以找到原因,是由於每一次Add新物件,EF都會自動DetectChanges
2016-3-2 下午 05-46-01.png

我們把這個功能關掉看看
加入這行:ef.Configuration.AutoDetectChangesEnabled = false;

        private void btnBulkInsert_Click(object sender, EventArgs e)
        {
            ef.Configuration.AutoDetectChangesEnabled = false;

            for (int i = 0; i < 2000; i++)
            {
                Employees newOne = new Employees();
                newOne.LastName = "Last_" + i.ToString();
                newOne.FirstName = "First_" + i.ToString();

                ef.Employees.Add(newOne);               
            }

            ef.SaveChanges();

            MessageBox.Show("Finish");
        }

結果如下,這次花費約12秒完成,節省一半以上的時間。

2016-3-2 下午 05-49-51.png


小提醒
雖然這個方法可以稍微改良Bulk Insert的效能問題
但和MS SQL的BulkCopy功能相比,速度還是相差太多
因此可以考慮使用其他套件來解決此問題
例如:EntityFramework.BulkInsert
或者是使用組合字串的方式,也可以暫時解決此問題

 

下一篇:[C#] 初探Entity Framework (七) – Update, Delete

廣告

One thought on “[C#] 初探Entity Framework (六) – Insert, Bulk Insert

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s