DbContext.Database.SetCommandTimeout работает не так, как ожидалось в ef Core 3.1

#c# #.net-core #entity-framework-core #ef-core-3.1

#c# #.net-ядро #entity-framework-core #ef-core-3.1

Вопрос:

У меня есть простой код, в котором я хочу, чтобы запрос имел тайм-аут для проверки моего ведения журнала исключений, поэтому я использую context.Database.SetCommandTimeout() метод, указывающий минимальное значение в 1 тик, но запрос не истекает по тайм-ауту и извлекает данные из базы данных.

Моя версия EF — EF Core 3.1.8.

Код выглядит следующим образом:

 await using var context = new CriusCommissionsDatabaseContext(_config);
context.Database.SetCommandTimeout(TimeSpan.FromTicks(1));
var saleSegments = await context.BSaleSegment 
                                .Include(x => x.Sale)
                                .Where(x => x.Sale.CorrelationId == correlationId)
                                .ToListAsync();
  

Ответ №1:

При запуске SetCommandTimeout функции в RelationalDatabaseFacadeExtensions что происходит в функции, так это то, что интервал времени преобразуется в целое число и TimeSpan.FromTicks(1) будет преобразован в 0 . Согласно DbCommand.Свойство CommandTimoout имеет следующие замечания

Примечание для разработчиков, рекомендуется, чтобы 0 означало отсутствие тайм-аута.

Так что в данном случае это означает промежуток времени.FromTicks(1) == нет таймаута, поэтому минимальное значение, которое вы могли бы ввести, должно быть равно int 1.