先說解決辦法:使用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。
