EF實現批量插入
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實現批量插入