gpt4 book ai didi

c# - EF SaveChangesAsync 极慢

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:42 30 4
gpt4 key购买 nike

我有一个表,我想在其中一次更新 100 行。我有一个用于查找特定行的 100 个 ID 的列表。找到后,我会为每一行更新一个列 (SyncOk)。

问题是更新 100 行需要大约 23 到 30 秒

dbContext.Configuration.ValidateOnSaveEnabled = false;
var count = ids.Count;
for (var i = 0; i < count; i++)
{
var id = ids[i];
var record = await dbContext.History
.FirstOrDefaultAsync(r => r.Id == id);
record.SyncOk = syncOk;
}
await dbContext.SaveChangesAsync();

一些注意事项:

  • ids是一个 IList<long>包含所有感兴趣的 ID。
  • syncOk是一个 bool 值。
  • 我试过设置 AutoDetectChangesEnabled属性设置为 false,然后在设置 SyncOk 后手动更新记录值(value) - 不会加快速度。

为什么是SaveChangesAsync()太慢了 - 我怎样才能提高上述功能的速度?我担心表在 23-30 秒内被锁定并且会使其他服务(使用同一个表)无法访问也更新一下。

最佳答案

您正在对数据库执行总共 ids.Count 个 SELECT 语句。如果您添加代码,可以看到这一点:

dbContext.Database.Log += Console.WriteLine;

尝试通过一次获取所有数据来最小化对 SQL 实例的访问:

var records = await dbContext.History.Where(i => ids.Contains(i.Id)).ToListAsync();

然后你应该执行你需要的修改:

foreach(var record in records)
{
record.SyncOk = syncOk;
}
await dbContext.SaveChangesAsync();

您也可以使用 ForEachAsync,它会像上面的代码部分一样只查询一次结果:

await dbContext.History.Where(i => ids.Contains(i.Id))
.ForEachAsync(i => i.SyncOk = syncOk);
await dbContext.SaveChangesAsync();

关于c# - EF SaveChangesAsync 极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948445/

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