dur*_*rsk 2 c# linq entity-framework
我正在尝试使用EF增强将数千行写入数据库的性能.我发现SaveChanges()的速度会在单个上下文中随着时间的推移而降低,并且在n个插入之后处理和重新创建上下文可以帮助解决这个问题.
using(Context context = new Context())
{
for(int i = 0; i < numberOfLines; i++)
{
context.Collection.AddObject(line);
if (i % 100 == 0)
{
context.SaveChanges()
// Here I would like to call dispose on context and then create a new one
}
}
}
Run Code Online (Sandbox Code Playgroud)
当然,我需要使用或执行类似的操作,因为还有很多事情要发生,我需要确保在任何时候抛出异常时都会调用dispose.
有任何想法吗?我知道我可以在try块之外声明上下文,然后使用context.Dispose()得到一个finally.我显然不想这样做.
编辑:我意识到我发布的代码片段并没有完全显示我为什么要这样做.for循环在IF语句之外的其他位置调用context.SaveChanges().因此,当IF评估为true时,我已经多次调用SaveChanges().
听起来你基本上想要批量处理一个集合.使用MoreLINQ(也在NuGet上)很简单:
foreach (var batch in dataToUpload.Batch(100))
{
using (var context = new Context())
{
foreach (var item in batch)
{
...
}
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
除了其他任何东西,它比使用一个带有检查的循环更清楚地描述了你想要实现的目标(IMO)i % 100.
(http://morelinq.googlecode.com的原始链接不再有效,替换为当前的GitHub链接)
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |