Использование Entity Framework в конечной точке NServiceBus создает исключение EntityException "Базовый поставщик не удалось открыть"

У меня есть конечная точка NServiceBus 5.2.9, и я внедряю экземпляр DBContext через NServiceBus.

Конфигурация:

public class ConfigureDependencyInjection : INeedInitialization
{
    public void Customize( BusConfiguration configuration )
    {
        configuration.RegisterComponents( reg =>
        {
            reg.ConfigureComponent<MyContext>( DependencyLifecycle.InstancePerUnitOfWork );
        } );
    }
}

Это конструктор сервиса:

    public NotificationService( IBus bus, IMyContext context )
    {
        this.bus = bus;
        this.context = context;
    }

Когда я пытаюсь получить доступ к контекстному полю, я получаю EntityException:

Возникло исключение: "System.Data.Entity.Core.EntityException" в NServiceBus.Core.dll Дополнительная информация: Ошибка основного поставщика при открытии.

Почему это происходит?

Я не уверен, какова правильная продолжительность жизни для этого. Это DependencyLifecycle.InstancePerUnitOfWork? DBContext - это UOW-конструкция, но я не уверен, что она одинакова для NServiceBus.

Сообщение, которое приходит к этой конечной точке, всегда является ОДНЫМ (транспортным) сообщением, поэтому это должно правильно применяться к использованию области действия InstancePerUnitOfWork.

Экземпляр контекста является общим в классе, поэтому каждый раз, когда я к нему обращаюсь, я блокируюсь с помощью syncLock следующим образом:

lock ( syncLock )
{
    log.Info( "Get customers..." );

    var result = from c in context.Customers
    ...
    select...;
}

Как бы я правильно использовал DBContext, не забывая о безопасности потоков?

Огромное спасибо.

РЕДАКТИРОВАТЬ: строка подключения / конфигурация в порядке, я использую один и тот же контекст во многих местах в том же самом, что настроено для app.config и / или web.config.

0 ответов

Другие вопросы по тегам