加速EF6 / sqlite数据库的模型实例化

本文关键字:模型 实例化 数据库 sqlite EF6 加速 | 更新日期: 2023-09-27 18:04:26

例如,我有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个模型类的实例化花费了太多时间。

我的问题是,是否有可能通过克隆或其他方式来加快模型类的安装过程?

或者,是否有机会将数据插入sqlite数据库而不使用。insert(someModel),也许是使用直接的sql命令或其他东西?显然,跳过模型实例化可能会有所帮助…

加速EF6 / sqlite数据库的模型实例化

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

unitOfWork.ItemRepository.Insert(myItem);

一开始不会花太多时间,但在100条或1000条记录之后,它会花很多时间。

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

我如何加快模型的实例化,或者是否有另一种方法可以更快地将数据插入sqlite数据库?

在你完成循环并插入"12000 data entries"之后,在你的repo中使用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的目的。