Исключение при попытке настроить NServiceBus для использования постоянства NHibernate

Я пытаюсь заставить несколько конечных точек использовать постоянство NHibernate после использования постоянного хранения в памяти для разработки. Я использую последние пакеты Nuget.

Сразу же я получаю следующие исключения. В нем упоминается Topshelf, на котором основан NServiceBus.Host, но я понятия не имею, почему.

Пожалуйста, обратите внимание: я не получаю никаких ошибок, используя постоянство в памяти.

Исключение: "System.InvalidOperationException" в NServiceBus.NHibernate.dll Исключение: "System.InvalidOperationException" в NServiceBus.Host.exe Исключение: "Magnum.StateMachine.StateMachineException" в NServiceBus.Host.exe Дополнительная информация: исключение произошло в Topshelf.Internal.ServiceController`1[[NServiceBus.Hosting.Windows.WindowsHost, NServiceBus.Host, Version=6.0.0.0, Culture= нейтральный, PublicKeyToken=9fc386479f8a226c]] во время состояния Initial при обработке OnStart

Возникло исключение: 'Magnum.StateMachine.StateMachineException' в NServiceBus.Host.exe Дополнительная информация: Исключение произошло в Topshelf.Internal.ServiceController`1[[NServiceBus.Hosting.Windows.WindowsHost, NServiceBus.Host, Version=6.0.0.0, Culture= нейтральный, PublicKeyToken=9fc386479f8a226c]] во время состояния Initial при обработке OnStart

Возникло исключение: "System.InvalidOperationException" в mscorlib.dll Произошло необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительная информация: в файле конфигурации не найдены свойства NHibernate (E:\Projects.........\MyEndpoint.dll.config).

Для запуска NServiceBus с NHibernate вам нужно как минимум указать строку подключения к базе данных. Вот пример того, что требуется:

<!-- 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"/>

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

Каталог = время ожидания; Интегрированная безопасность =True" />

В документации не говорится, что эти настройки являются обязательными в app.config каждой конечной точки. Я хочу настроить это исключительно в коде. Это вообще возможно?

Это моя конфигурация NH, для которой я создал пустую базу данных SqlServer 2014 под названием "nservicebus":

    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 остается строка подключения, которая мне так или иначе нужна для Entity Framework.

Но, как упоминает @DavidBoike ниже, вы также можете извлечь это из app.config и настроить его программно.

1 ответ

Вы можете легко настроить строку подключения в коде:

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

Вы должны включить NServiceBus.Persistence пространство имен для метода расширения, который будет доступен.

Вы правы, что страница документации NHibernate Persistence не охватывает просто очень хорошую настройку строки подключения. Я открыл проблему GitHub в хранилище документов, чтобы отследить это.

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