2

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

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

请注意:使用内存持久性我根本没有收到任何错误。

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

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

引发的异常:mscorlib.dll 中的“System.InvalidOperationException” 在 mscorlib.dll 中发生了“System.InvalidOperationException”类型的未处理异常附加信息:在您的配置文件中找不到 NHibernate 属性(E:\Projects....... ..\MyEndpoint.dll.config)。

要使用 NHibernate 运行 NServiceBus,您至少需要指定数据库连接字符串。以下是所需内容的示例:

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

value="NHibernate.Driver.Sql2008ClientDriver"/>

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

目录=超时;集成安全=True" />

文档没有说这些设置在每个端点的 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 中取出并以编程方式对其进行配置。

4

1 回答 1

2

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

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

您确实需要包含NServiceBus.Persistence扩展方法可用的命名空间。

您是对的,NHibernate Persistence文档页面并没有简单地很好地设置连接字符串。我在 docs 存储库上打开了一个 GitHub 问题来跟踪它。

于 2015-11-16T15:19:56.937 回答