在NServiceBus端点中使用实体框架会抛出EntityException"底层提供程序在Open"

时间:2015-11-12 14:22:13

标签: c# dependency-injection entity-framework-6 autofac nservicebus5

我有一个NServiceBus 5.2.9端点,我正在通过NServiceBus注入一个DBContext实例。

配置:

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:

  

抛出异常:&#39; System.Data.Entity.Core.EntityException&#39;在NServiceBus.Core.dll中   附加信息:基础提供程序在Open上失败。

为什么会这样?

我不确定正确的生命周期范围是什么。是DependencyLifecycle.InstancePerUnitOfWork吗? DBContext是一个UOW构造,但我不确定它是否与NServiceBus相同。

此端点的消息始终是ONE(传输)消息,因此这应该适用于使用InstancePerUnitOfWork范围。

上下文实例在类中共享,因此每次访问它时都会锁定syncLock,如下所示:

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

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

如何在保持线程安全的同时正确使用DBContext?

非常感谢你。

修改 连接字符串/配置没问题,我在同一个地方使用相同的上下文,根据app.config和/或web.config配置。

0 个答案:

没有答案