尝试配置NServiceBus以使用NHibernate持久性时出现异常

时间:2015-11-16 00:16:25

标签: c# nhibernate nservicebus topshelf nservicebus5

在使用内存持久性进行开发之后,我试图让一些端点使用NHibernate持久性。我正在使用最新的Nuget包。

马上,我得到以下例外情况。它提到了NServiceBus.Host所基于的Topshelf,但我不知道为什么。

请注意:我完全没有使用内存中持久性的错误。

  

抛出异常:'System.InvalidOperationException'   抛出NServiceBus.NHibernate.dll异常:   NServiceBus.Host.exe异常中的“System.InvalidOperationException”   抛出:'Magnum.StateMachine.StateMachineException'中   NServiceBus.Host.exe附加信息:发生异常   Topshelf.Internal.ServiceController`1 [NServiceBus.Hosting.Windows.WindowsHost,   NServiceBus.Host,Version = 6.0.0.0,Culture = neutral,   PublicKeyToken = 9fc386479f8a226c]]处理状态初始状态   的OnStart

     

抛出异常:'Magnum.StateMachine.StateMachineException'中   NServiceBus.Host.exe附加信息:发生异常   Topshelf.Internal.ServiceController`1 [NServiceBus.Hosting.Windows.WindowsHost,   NServiceBus.Host,Version = 6.0.0.0,Culture = neutral,   PublicKeyToken = 9fc386479f8a226c]]处理状态初始状态   的OnStart

     

抛出异常:mscorlib.dll中的“System.InvalidOperationException”   “System.InvalidOperationException”类型的未处理异常   发生在mscorlib.dll中附加信息:没有NHibernate   在配置文件中找到的属性   (E:\项目......... \ MyEndpoint.dll.config)。

     

要使用NHibernate运行NServiceBus,您至少需要指定   database connectionstring。以下是需要的示例:
                

<!-- other optional settings examples -->
<add key="NServiceBus/Persistence/NHibernate/connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="NServiceBus/Persistence/NHibernate/connection.driver_class"
     

值= “NHibernate.Driver.Sql2008ClientDriver”/&GT;       
                        

<!-- Optional overrides per persister -->
<add name="NServiceBus/Persistence/NHibernate/Timeout" connectionString="Data Source=.\SQLEXPRESS;Initial
     

Catalog = timeout; Integrated Security = True“/&gt;                            
  

documentation并未说明这些设置在每个端点的app.config中都是必需的。 我想在代码中专门配置它。这甚至可能吗?

这是我的NH配置,为此我创建了一个名为“nservicebus”的空SqlServer 2014数据库:

    config.EnableInstallers();

    var nhConfig = new Configuration
    {
        Properties =
        {
            ["dialect"] = "NHibernate.Dialect.MsSql2012Dialect",
            ["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider",
            ["connection.driver_class"] = "NHibernate.Driver.Sql2012ClientDriver"
        }
    };

    config.UsePersistence<NHibernatePersistence>().UseConfiguration( nhConfig );
....

我错过了什么?文档说得很简单,但事实并非如此。

修改

这项工作的成果是这样做的:

        config.EnableInstallers();

        //OLD, didn't work
        //var nhConfig = new Configuration
        //{
        //    Properties =
        //    {
        //        ["dialect"] = "NHibernate.Dialect.MsSql2012Dialect",
        //        ["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider",
        //        ["connection.driver_class"] = "NHibernate.Driver.Sql2012ClientDriver"
        //    }
        //};

        var nhConfiguration = new Configuration();
        nhConfiguration.SetProperty( NHibernate.Cfg.Environment.ConnectionProvider, "NHibernate.Connection.DriverConnectionProvider" );
        nhConfiguration.SetProperty( NHibernate.Cfg.Environment.ConnectionDriver, "NHibernate.Driver.Sql2008ClientDriver" );
        nhConfiguration.SetProperty( NHibernate.Cfg.Environment.Dialect, "NHibernate.Dialect.MsSql2008Dialect" );
        nhConfiguration.SetProperty( NHibernate.Cfg.Environment.ConnectionStringName, "NServiceBus/Persistence" );

        config.UsePersistence<NHibernatePersistence>().UseConfiguration( nhConfiguration );

MsSql2008Dialect也适用于Sql 2012,2014。

app.config中剩下的是连接字符串,无论如何我都需要实体框架。

但是,正如@DavidBoike在下面提到的那样,您也可以从app.config中取出它并以编程方式对其进行配置。

1 个答案:

答案 0 :(得分:2)

您可以在代码中轻松配置连接字符串:

busConfiguration.UsePersistence<NHibernatePersistence>()
    .ConnectionString("your-connection-string-here");

您需要包含NServiceBus.Persistence命名空间才能使扩展方法可用。

你是对的,NHibernate Persistence文档页面不仅仅包括设置连接字符串。我已opened a GitHub issue on the docs repository跟踪此事。