【发布时间】:2022-11-17 09:56:03
【问题描述】:
我正在尝试保存大约 20,000 条记录,并且需要花费不可原谅的时间才能完成。实现这一目标的最佳方法是什么?
这是我目前拥有的:
public async Task SaveOrUpdateItemAsync(List<DepartmentalizedItem> departmentalizedItems)
{
using(WarehouseContext dbContext = new WarehouseContext())
{
using(SemaphoreSlim throttler = new SemaphoreSlim(20))
{
var tasks = departmentalizedItems.Select(async item =>
{
await throttler.WaitAsync();
if (item.PK_DepartmentalizedItemId == 0)
dbContext.DepartmentalizedItems.Add(item);
else
{
var deptItem = await dbContext.DepartmentalizedItems.FindAsync(item.PK_DepartmentalizedItemId);
dbContext.Entry(deptItem).CurrentValues.SetValues(item);
}
throttler.Release();
});
await Task.WhenAll(tasks);
}
await dbContext.SaveChangesAsync();
}
}
我也尝试过 Parallel.ForEach 但我遇到了同步问题。
谢谢你。
【问题讨论】:
-
您可以检查 this 关于实体状态以避免 Find 调用。
-
你应该看看 BulkInsert entityframework-extensions.net/bulk-insert
-
@Hasse 这似乎是一个付费图书馆。还有其他选择吗?
-
@StavrosZotalis 我已经试过了,但是我遇到了一个错误。 “失败,因为同一类型的另一个实体已经具有相同的主键值。”。我记得同样的错误是我不使用 EntityState 的原因。
-
@redz0323 测试这个 nuget 包 nuget.org/packages/EntityFramework6.BulkInsert
标签: c# entity-framework-6