gpt4 book ai didi

c# - EF SaveChanges 优化?

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

为什么 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/

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