1. 程式人生 > >EF實現批量插入

EF實現批量插入

ros ins 時間 OS AC ons 數據庫 利用 mil

Z.EntityFramework.BulkInsert

EntityFramework 最被人詬病的地方就是它的性能,處理大量數據時的效率。此種條件下,通常會轉回使用 ADO.NET 來完成任務。而EntityFramework.BulkInsert則是利用了Microsoft SQL Server的SqlBulkCopy 接口,實現了批量插入數據時的高效率。

在網上找到兩篇相關的帖子,分別是:

(1)http://www.cnblogs.com/gaochundong/p/entity_framework_bulk_insert_extension.html,詳細介紹SqlBulkCopy的實現原理及封裝,鑒於水平有限,不能完全讀懂,只能知其一二,代碼沒有運行起來。

(2)http://blog.csdn.net/pukuimin1226/article/details/48024995,對EF常規方式與BulkInsert批量插入方式進行了對比,但按照帖子中的nuget包安裝後,實際測試會出現“空間“CSSpace”沒有關聯的集合。”的錯誤提示。

最終解決是在:

http://efbulkinsert.codeplex.com/

安裝包:在項目nuget程序包管理器中搜索:“EntityFramework.Extensions.EF5”,如圖:

技術分享圖片

安裝第一項:Z.EntityFramework.Extensions.EF5即可。

簡單DEMO:

(1)建表

我使用的是db first方式,在數據庫中新建了一個測試表,只有兩個字段,一個自增ID,一個測試用字段Title,數據表示意如下:

技術分享圖片

(2)編寫測試DEMO

使用BulkInsert方式,與常規方式主要區別在於插入及保存方式,即:

db.BulkInsert(List);
db.BulkSaveChanges();

以下為向該表插入1萬條數據的測試代碼:

技術分享圖片
            StringBuilder sb = new StringBuilder();
            ydssEntities db = new ydssEntities();
            List<ydss_Test> List = new List<ydss_Test>();

            //插入一萬條數據
            for (int i = 0; i < 10000;i++ )
            {
                List.Add(new ydss_Test { Title = i.ToString() });
            }
            Stopwatch sw = new Stopwatch();
            sw.Start();
            db.BulkInsert(List);
            db.BulkSaveChanges();
            sw.Stop();
            sb.AppendFormat("BulkInsert插入耗時:{0}\r\n", sw.ElapsedMilliseconds);
            Response.Write(sb.ToString());
技術分享圖片

實測執行結果:插入一萬條數據的執行時間為:1742毫秒,不到兩秒的時間,執行結果相對滿意。

註:EntityFramework.BulkInsert不支持關聯表數據插入,以關聯方式批量插入數據時會出錯。

本文轉自:https://www.cnblogs.com/superfeeling/p/6382193.html

EF實現批量插入