为什么在每个SaveChanges()之后处理DbContext ctx的速度更快?
第一个示例:
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而不是重建?
发布于 2013-03-14 21:40:28
按照@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();
}
}
}https://stackoverflow.com/questions/15409933
复制相似问题