我有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命令或其他?显然跳过模型实例化可能会有所帮助......
答案 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个矩阵单元时,我发现这非常有效。只需使用await
和SaveChangesAsync()
提高效果 12次。其他策略,例如批处理,虽然有些有用,但可以说无法使用ORM 的目的,但效果并不如AutoDetectChangesEnabled
等禁用选项。