gpt4 book ai didi

c# - 在 using block 内部,需要处理和重新实例化

转载 作者:行者123 更新时间:2023-11-30 19:26:48 26 4
gpt4 key购买 nike

我正在尝试提高使用 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
}
}
}

当然,我需要使用 using 或做类似的事情,因为还有很多事情要做,我需要确保在任何时候抛出异常时调用 dispose。

有什么想法吗?我知道我可以在 try block 之外声明上下文,然后使用 context.Dispose() 进行 finally。不过,我显然不想那样做。

编辑:我意识到我发布的代码片段并没有完全说明我为什么要这样做。 for 循环在 IF 语句之外的其他位置调用 context.SaveChanges()。因此,当 IF 计算结果为真时,我已经多次调用 SaveChanges()。

最佳答案

听起来您基本上是想批量处理一个集合。使用 MoreLINQ 很简单( also on NuGet ):

foreach (var batch in dataToUpload.Batch(100))
{
using (var context = new Context())
{
foreach (var item in batch)
{
...
}
context.SaveChanges();
}
}

除此之外,描述你想要实现的目标 (IMO) 比使用一个循环检查 i % 100 更清楚.

(http://morelinq.googlecode.com 的原始链接不再有效,替换为当前的 GitHub 链接)

关于c# - 在 using block 内部,需要处理和重新实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21099852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com