加速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命令或其他东西?显然,跳过模型实例化可能会有所帮助…
瓶颈可能是将实体添加到上下文。
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个矩阵单元时,我发现这非常有效。仅使用await
和SaveChangesAsync()
可使性能提高12倍。其他策略,如批处理没有那么有效,禁用选项如AutoDetectChangesEnabled
虽然有些有用,但可以说违背了使用ORM的目的。