实体框架扩展批量插入忽略设置超时

问题描述 投票:0回答:1

我们正在尝试使用实体框架批量插入将大型数据集(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();
    }
}
c# entity-framework automapper ef-bulkinsert
1个回答
0
投票

如果您执行以下操作,它应该会起作用

context.Database.SetCommandTimeout(1800);
© www.soinside.com 2019 - 2024. All rights reserved.