第一个Tempdata有352.000条记录,第二个有146.000条记录,第三个有232.000条记录。
这种情况。这里是执行此操作的代码。
while (true)
{
var result = carDatabaseClient.GetInvoiceLines(authorizedService, authorizedService.LastInvoiceLineUpdate, lastId);
if (result != null)
{
if (result.Rows.Count != 0)
{
var dataRows = Functions.Convert<InvoiceLine>(result).Select(s =>
{
s.Id = authorizedService.Id + "-" + s.DcId;
s.AuthorizedServiceId = authorizedService.Id;
if (!string.IsNullOrWhiteSpace(s.InvoiceId)) s.InvoiceId = authorizedService.Id.ToString() + "-" + s.InvoiceId;
return s;
}).ToList();
invoiceLineService.SaveOrUpdateRange(dataRows);
documentsTotal += dataRows.Count;
lastId = dataRows.LastOrDefault()?.DcId;
Thread.Sleep(2000);
}
else
break;
}
else
break;
}
每个查询保存500.000条记录。 并且重复大约3次。而且前2个while循环可以正确保存,但最后一个while循环会卡在临时表中,并且不会保存任何留给第3个循环的记录。
这是saveOrUpdateRange方法。
public void AddOrUpdateRange(IList<T> entities)
{
Context.Database.SetCommandTimeout(TimeSpan.FromMinutes(5));
Context.BulkInsertOrUpdate(entities);
Context.SaveChanges();
}
BulkInsertOrUpdate使用EFCore.Bulkextensions nuget。
这里是我的服务范围。
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
//services.AddDbContextPool<ApplicationContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
//services.AddDbContext<ApplicationContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));