C# 环境足迹变化优化?
为什么DbContextC# 环境足迹变化优化?,c#,entity-framework,C#,Entity Framework,为什么DbContextctx在每次SaveChanges()执行后都要进行处理 第一个样本: var ctx = new DomainContext(); foreach (var item in deals) { DealsOfReutersAddition newDealAddition = new DealsOfReutersAddition {
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();
}
}
}
我只需调用
SaveChagnes
一次即可优化此代码。在循环之外,它估计为4.8秒,你应该正确地这样做:)在所有情况下,只保存一次会更快。保存不会立即释放内存。真正的诀窍是使用每批上下文的方法;ctx=新域上下文();