为什么 DbContext ctx
在每次 SaveChanges()
执行后处理得更快?
第一个样本:
var ctx = new DomainContext();
foreach (var item in deals)
{
DealsOfReutersAddition newDealAddition =
new DealsOfReutersAddition
{
DealsOfReutersId = item.DealsOfReutersId,
DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
};
ctx.DealsOfReutersAdditions.Add(newDealAddition);
ctx.SaveChanges();
}
ctx.Dispose();
第二个样本:
foreach (var item in deals)
{
DealsOfReutersAddition newDealAddition =
new DealsOfReutersAddition
{
DealsOfReutersId = item.DealsOfReutersId,
DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
};
var ctx = new DomainContext();
ctx.DealsOfReutersAdditions.Add(newDealAddition);
ctx.SaveChanges();
ctx.Dispose();
}
在 1000 行中,第二个样本估计为 8 秒,而第一个样本为 140 秒。 有什么方法可以清理 ctx 而不是重新创建?
最佳答案
根据@JensKloster 在评论中所说的内容,您绝对不想在循环中每次都调用 SaveChanges
。但我实际上会抵制将其置于循环之外的诱惑。随着上下文跟踪的对象数量越来越多,内存将被用完,这将使增量保存变得缓慢。
那么,我的解决方案是在循环中设置一个运行计数器来确定何时进行保存:
int numberOfRecords = 0;
using(var ctx = new DomainContext())
{
foreach (var item in deals)
{
DealsOfReutersAddition newDealAddition =
new DealsOfReutersAddition
{
DealsOfReutersId = item.DealsOfReutersId,
DealDate = DateTime.Parse(item.DateConfirmed ?? "01 01 01", new CultureInfo("en-US")),
};
ctx.DealsOfReutersAdditions.Add(newDealAddition);
numberOfRecords++;
if(numberOfRecords % 500 == 0) //Saves after every 500 rows.
{
ctx.SaveChanges();
}
}
}
关于c# - EF SaveChanges 优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15409933/