首页 > 解决方案 > 实体框架扩展 bulkinsert 忽略设置超时

问题描述

我们正在尝试使用实体框架批量插入将一个大型数据集(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 分钟后,此超时。

所以,为了解决这个问题,我们添加了一个 batchsize

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();
    }
}

标签: c#entity-frameworkautomapperef-bulkinsert

解决方案


推荐阅读