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

Speed up model instantiation for EF6 / sqlite db

例如,我有一个包含 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 命令或其他方式?显然跳过模型实例化可能会有帮助...

How can I speed up the instantiation of the models or is there maybe another way to insert the data faster into the sqlite database?

在完成循环并插入 "12000 个数据条目" 后,在您的存储库中使用 await Context.SaveChangesAsync() 的等效项。

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

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 倍。其他策略,如 批处理 并不那么有效,并且禁用选项如 AutoDetectChangesEnabled 虽然有点有用,但可以说 违背了使用 ORM 的目的.

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

unitOfWork.ItemRepository.Insert(myItem);

一开始用不了多少时间,但100s或1000条记录后,就可以了。

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