Использование 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.