Функции Azure с EF Core DbContext — как работает область DI?C#

Место общения программистов C#
Ответить
Anonymous
 Функции Azure с EF Core DbContext — как работает область DI?

Сообщение Anonymous »


Сейчас я работаю над приложением-функцией Azure в .NET Core и пытаюсь добавить транзакции для запросов. Проблема в том, что когда вызов функции выполняет работу между вызовом context.Database.BeginTransaction(...) и вызовом transaction.CommitAsync(...), тогда другой вызов функции не сможет сохраниться в базе данных и получит таймаут:

[2024-01-04T07:23:29.957Z] Исключение произошло в базе данных при сохранении изменений для типа контекста «MyContext». [2024-01-04T07:23:29.957Z] System.InvalidOperationException: возникло исключение, которое, вероятно, связано с временным сбоем. [2024-01-04T07:23:29.957Z] ---> Microsoft.EntityFrameworkCore.DbUpdateException: произошла ошибка при сохранении изменений сущности. Подробности смотрите во внутреннем исключении. [2024-01-04T07:23:29.958Z] ---> Npgsql.NpgsqlException (0x80004005): Исключение при чтении из потока [2024-01-04T07:23:29.958Z] ---> System.TimeoutException: тайм-аут во время попытки чтения Этот другой вызов функции может прекрасно сохраняться, если заранее не вызывается «длительный» вызов функции. Поэтому я предполагаю, что открытая транзакция блокирует DbContext в других вызовах функций.

Наш DbContext регистрируется следующим образом:

builder.Services.AddDbContext( опции => опции .UseNpgsql(dbConnStr) .UseSnakeCaseNamingConvention()); Насколько я понимаю, каждый вызов функции должен иметь собственную область внедрения зависимостей, как в ASP .NET Core, где «одна и та же» настройка работает без проблем.

Я что-то упустил?

РЕДАКТИРОВАТЬ: Я нашел человека с такой же проблемой, скрытой в старой проблеме Github: https://github.com/Azure/azure-function ... uecomment- 896712016, но решения с решением, похоже, не последовало.

РЕДАКТИРОВАНИЕ 2:

Основное описание двух функций:
публичный класс LongerRunningFunctionClass { [Функция("LongerRunningFunction")] public static HttpResponseData LongerRunningFunction([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, FunctionContext ExecutionContext) { дождитесь использования транзакции var = ожидайте _dbContext.Database.BeginTransactionAsync(); пытаться { // Представьте себе, что здесь есть какой-то код, вставляющий данные в базу данных // и выполняем вызовы внешних сервисов дождаться транзакции.CommitAsync(); } поймать (Исключение) { дождаться транзакции.RollbackAsync(); бросать; } } } общественный класс OtherFunctionClass { [Функция("ДругаяФункция")] public static HttpResponseData OtherFunction([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, FunctionContext ExecutionContext) { дождитесь использования транзакции var = ожидайте _dbContext.Database.BeginTransactionAsync(); пытаться { // Представьте себе быструю вставку здесь дождаться транзакции.CommitAsync(); } catch (Exception) { //
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»