Очередь функций Azure, запущенная с помощью Mediatr - ошибка DbContext - PullRequest
0 голосов
/ 31 марта 2019

Я реализую функцию Azure, запускаемую очередью - я использую библиотеку шаблонов Mediator под названием Mediatr для улучшения разделения запросов команд - и использую новейшее внедрение зависимостей конструктора во время выполнения (2.0.12382.0) в функции Azure в соответствии со следующим руководство https://devkimchi.com/2019/02/22/performing-constructor-injections-on-azure-functions-v2/

Для каждого запуска функции Azure я вызываю Mediatr CommandHandler, но получаю сообщение об ошибке:

"Вторая операция началась в этом контексте перед завершением предыдущей операции. Обычно это вызвано тем, что разные потоки используют один и тот же экземпляр DbContext, однако члены экземпляра не гарантированно безопасны для потоков. Это также может быть вызвано вложенным запрос оценивается на клиенте, в этом случае переписайте запрос, избегая вложенных вызовов. "

В сообщении об ошибке указывается, что я пытаюсь получить доступ к одному и тому же экземпляру DbContext из параллельных задач. однако у меня есть только один обработчик команд (Mediatr Handler) и один обработчик запросов. и я использую инъекцию конструктора для этого

Я пытался изменить службу Meditr, чтобы она была временной при запуске, но все равно получала ту же ошибку при тестировании функции в эмуляторе функции Azure

Класс запуска

public class StartUp : IWebJobsStartup
{

    public void Configure(IWebJobsBuilder builder)
    {
        var configuration = new ConfigurationBuilder()
             .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
             .AddEnvironmentVariables()
             .Build();
        var connection = configuration.GetConnectionString("Default"); 
        builder.Services.AddDbContext<CoreDBContext>(options =>
        {
            options.UseSqlServer(connection, p =>
            {
                p.MigrationsAssembly("B12Core.Persistence");
            });
        }
        );
        builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPreProcessorBehavior<,>));
        builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPerformanceBehaviour<,>));
        builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestValidationBehavior<,>));
        builder.Services.AddMediatR(p =>
        {
            p.AsTransient();

        }, typeof(CreateMessageCommand).GetTypeInfo().Assembly);
    }
}

Полная ошибка

System.Private.CoreLib: Исключительная ситуация при выполнении функции: Function1. Microsoft.EntityFrameworkCore: вторая операция началась в этом контексте до завершения предыдущей операции. Обычно это вызвано тем, что разные потоки используют один и тот же экземпляр DbContext, однако члены экземпляра не гарантированно безопасны для потоков. Это также может быть вызвано тем, что вложенный запрос оценивается на клиенте, если это так, переписать запрос, избегая вложенных вызовов.

1 Ответ

0 голосов
/ 31 марта 2019

Решено, изменив время жизни вставки контекста БД на ServiceLifetime.Transient

 builder.Services.AddDbContext<CoreDBContext>(options =>
            {
                options.UseSqlServer(connection, p =>
                {
                   p.MigrationsAssembly("Presistence");
                });
            },ServiceLifetime.Transient
            );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...