例如,我收集了大量的12000个数据条目,并希望通过EF6将它们插入到sqlite数据库中。大多数时间消耗--数据模型的实例化:
目前,我循环了12000次‘新的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命令或其他方法?显然跳过模型实例化可能会有帮助..。
发布于 2016-08-30 00:20:14
瓶颈可能是将实体添加到上下文中。
unitOfWork.ItemRepository.Insert(myItem);
起初它不需要太多的时间,但是在1000条记录之后,它确实需要时间。
还请参阅this answer以获得您可能添加的其他优化(请阅读链接答案的注释!)。
发布于 2016-08-29 02:03:13
如何加快模型的实例化,或者是否有其他方法可以更快地将数据插入sqlite数据库?
在完成循环并插入"12000数据条目“之后,在回购中使用等效的await Context.SaveChangesAsync()
。Tell me more
注意,为了提高性能,不再需要执行以下操作:
context.Configuration.AutoDetectChangesEnabled = false; // out of date
context.Configuration.ValidateOnSaveEnabled = false; // out of date
...such代码有其自身的缺点,但更重要的是,它基于过时的哲学,没有利用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的目的。
https://stackoverflow.com/questions/39203463
复制相似问题