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。