我正在寻找插入实体框架的最快方法。
我问这个是因为您有一个活动并且插入很大(4000+)的情况。它可能会持续超过 10 分钟(事务的默认超时),这将导致事务不完整。TransactionScope
网友回答:
这种组合可以很好地提高速度。
context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.ValidateOnSaveEnabled = false;
网友回答:
您应该考虑为此使用 。这是文档,当然网上也有很多教程。System.Data.SqlClient.SqlBulkCopy
抱歉,我知道您正在寻找一个简单的答案来让 EF 执行您想要的操作,但批量操作并不是 ORM 的真正用途。
网友回答:
对于您在问题评论中的评论:
“…保存更改(对于每
条记录)…”
这是你能做的最糟糕的事情!调用每条记录会大大降低批量插入的速度。我会做一些简单的测试,这些测试很可能会提高性能:SaveChanges()
SaveChanges()
SaveChanges()
SaveChanges()
对于批量插入,我正在研究并尝试这样的模式:
using (TransactionScope scope = new TransactionScope())
{
MyDbContext context = null;
try
{
context = new MyDbContext();
context.Configuration.AutoDetectChangesEnabled = false;
int count = 0;
foreach (var entityToInsert in someCollectionOfEntitiesToInsert)
{
++count;
context = AddToContext(context, entityToInsert, count, 100, true);
}
context.SaveChanges();
}
finally
{
if (context != null)
context.Dispose();
}
scope.Complete();
}
private MyDbContext AddToContext(MyDbContext context,
Entity entity, int count, int commitCount, bool recreateContext)
{
context.Set<Entity>().Add(entity);
if (count % commitCount == 0)
{
context.SaveChanges();
if (recreateContext)
{
context.Dispose();
context = new MyDbContext();
context.Configuration.AutoDetectChangesEnabled = false;
}
}
return context;
}
我有一个测试程序,它将 560.000 个实体(9 个标量属性,无导航属性)插入数据库。使用此代码,它可以在不到 3 分钟的时间内工作。
对于性能,重要的是调用“许多”记录(“许多”大约 100 或 1000)。它还提高了在保存更改后释放上下文并创建新上下文的性能。这会从所有 entites 中清除上下文,不这样做,实体仍然附加到状态中的上下文。上下文中附加实体的大小不断增大,会逐步减慢插入速度。因此,一段时间后清除它是有帮助的。SaveChanges()
SaveChanges
Unchanged
以下是我的 560000 个实体的一些度量:
上面第一个测试中的行为是性能是非常非线性的,并且随着时间的推移而急剧下降。(“许多小时”是一个估计,我从未完成这个测试,我在 50.000 分钟后停止在 20 个实体。这种非线性行为在所有其他测试中并不那么重要。
模板简介:该模板名称为【在实体框架中插入的最快方法?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。