Первый 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 использует nuget EFCore.Bulkextensions.
Вот объем моих услуг.
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<>));
Я нигде не вижу журналов ошибок, но сервер sql не удаляет временные таблицы. И они не сохраняются в основной таблице
Но зачем это нужно. Где ваш код их удаляет. Где вы размещаете свой контекст? Вы не показываете соответствующие разделы своего кода
Я использую общий и общий шаблон репозитория. У меня нет метода idisposable as ни в одном из общих классов. Не следует массовое обновление удалять временные таблицы после того, как его работа будет выполнена. Отредактировал свой ответ, чтобы показать конфигурацию службы
Глядя на код, временная таблица должна быть удалена после завершения операции, если не указан UseTempDb github.com/borisdj/EFCore.BulkExtensions/blob/master/…
Какую ошибку вы получаете? Использование памяти? Пожалуйста, больше информации!