我们正在尝试使用实体框架批量插入将大型数据集(2+ 百万条记录)插入到我们的数据库中。
扩展是
EntityFramework.BulkInsert.Extensions
(nuget EntityFramework.BulkInsert-ef6
) 版本 6.0.2.8。
我们按以下方式使用它:
using (StockEntities context = new StockEntities())
{
var entities = AutoMapper.Mapper.Map<List<ImportLots>>(lots).ToArray();
context.BulkInsert(entities, new BulkInsertOptions { TimeOut = 1800 });
context.SaveChanges();
}
然而,大约1分钟后,这次就超时了。
因此,为了解决这个问题,我们添加了一个批量大小
using (StockEntities context = new StockEntities())
{
var entities = AutoMapper.Mapper.Map<List<ImportLots>>(lots).ToArray();
context.BulkInsert(entities, new BulkInsertOptions { TimeOut = 1800, BatchSize = 100000 });
context.SaveChanges();
}
但是,没有骰子。看起来
BulkInsertOptions
被忽略了。有人遇到过这种情况么?解决这个问题的最佳方法是什么?
编辑:添加以下内容只是为了测试,但是仍然没有骰子。大约1分钟后仍然超时。
context.Database.CommandTimeout = 1800;
编辑:将代码转换为以下内容,这似乎有效,所以看来 BulkInsertOptions 被忽略了
using (StockEntities context = new StockEntities())
{
context.Database.CommandTimeout = 1800;
var entities = AutoMapper.Mapper.Map<List<ImportLots>>(lots).ToArray();
int batches = entities.Count() / 100000;
for(int i = 0; i < batches; i++)
{
context.BulkInsert(entities.Skip(i * 100000).Take(100000), new BulkInsertOptions { TimeOut = 1800});
context.SaveChanges();
}
}
如果您执行以下操作,它应该会起作用
context.Database.SetCommandTimeout(1800);