加速EF6 / sqlite db的模型实例化

时间:2016-08-29 09:59:28

标签: c# sqlite entity-framework-6 unit-of-work

我有12000个数据条目的大量集合,并希望通过EF6将它们插入到sqlite数据库中。大部分时间消耗数据模型的实例化

此刻我循环了12000次' new myItem()'

downloaded12000Items.foreach(result =>{
    var myItem= new myItem
    {
        Id = result.Id,
        Description = result.Description,
        Property1 = result.Property1
    }
    resultList.add(myItem);
});

unitOfWork.ItemRepository.InsertRange(resultList);

如何加快模型的实例化,或者是否有其他方法可以更快地将数据插入到sqlite数据库中?

编辑:我必须更好地解释我的问题。瓶颈不是insert()进入数据库。要使用EF6 .insert(someModel),您必须创建实体的模型类的实例。我必须这样做12000次,所有12000个模型类的实例化需要花费太多时间。

我的问题是,是否有可能通过克隆或其他方式来加强模型类的实例化过程?

或者,是否有可能在不使用.insert(someModel)的情况下将数据插入sqlite数据库,可能是使用直接sql命令或其他?显然跳过模型实例化可能会有所帮助......

2 个答案:

答案 0 :(得分:1)

瓶颈可能是将实体添加到上下文中。

unitOfWork.ItemRepository.Insert(myItem);

首先它不需要花费太多时间,但是在100次或1000次记录之后,确实会这样做。

另请参阅this answer以了解您可以添加的其他优化(阅读链接答案的评论!)。

答案 1 :(得分:0)

  

如何加快模型的实例化,或者是否有其他方法可以更快地将数据插入到sqlite数据库中?

完成循环并插入" 12000数据条目" 后,在您的仓库中使用等效的await Context.SaveChangesAsync()Tell me more

请注意,为了提高性能,不再需要执行以下操作:

context.Configuration.AutoDetectChangesEnabled = false;  // out of date
context.Configuration.ValidateOnSaveEnabled = false; // out of date

......这样的代码有其自身的缺点,但更重要的是它基于过时的哲学,并没有利用EF中的await

这是我用来保存需求实现矩阵的生产代码片段:

// create your objects
var matrix = // in my prod code I create in excess of 32,600+ matrix cells
foreach (var cell in cellsToAdd)
{
    matrix.Cells.Add(cell);
}

using (var context = new MyDbContext())
{
    context.Matrices.Add (newMatrix);

    await context.SaveChangesAsync();
}

当我在生产环境中插入32,646个矩阵单元时,我发现这非常有效。只需使用awaitSaveChangesAsync()提高效果 12次。其他策略,例如批处理,虽然有些有用,但可以说无法使用ORM 的目的,但效果并不如AutoDetectChangesEnabled等禁用选项。