EntityFramework批量Insert


先說解決辦法:使用SqlBulkCopy。 

 

然后問題是:這個和EF沒有半點關系,還要拼DataSet。

 

再是解決辦法:你可以自己封裝一個,也可以使用人家寫好的 EntityFramework.BulkInsert  (https://efbulkinsert.codeplex.com/ )。 看了一下代碼, 里面就是用SqlBulkCopy實現的。 

 

使用起來也很簡單:

            Stopwatch sw = Stopwatch.StartNew();
            var cx = new RETestEntities();

            var entitys = new List<Staff>();
            
            for (var i = 0; i < 100000; i++)
            {
                entitys.Add(new Staff()
                {
                    StaffID = i,
                    StaffName = "name" + i
                });
            }

            cx.BulkInsert(entitys);
            //cx.Staff.AddRange(entitys);                 //4674, 4664
            cx.SaveChanges();
            Console.WriteLine(sw.ElapsedMilliseconds); //1495, 910
            Console.Read();

性能對比:

插入十萬數據(雖然只有兩列), 第一次1495ms,第二次910ms

順便看了一下原生的, 十萬實在是等不了了,改成一千,需要 4674ms , 4664ms

 

另外,網上看有人說,可以設置

cx.Configuration.AutoDetectChangesEnabled = false;
cx.Configuration.ValidateOnSaveEnabled = false;

不過,我試了,沒用,不知道是不是姿式不對。

 

需要注意的是:

這個擴展,不支持事務在外面提交,它的代碼是這樣的:

                    try
                    {
                        Run(entities, transaction);
                        transaction.Commit();
                    }
                    catch (Exception)
                    {
                        if (transaction.Connection != null)
                        {
                            transaction.Rollback();
                        }
                        throw;
                    }

自動就commit了,如果有需要外面提交,可能就要修改源代碼了, 網站上都有得下。 

另外,就算自己實現也不是很復雜,就是實現了SQL的批量Insert。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM