在使用内存中的持久性进行开发之后,我正在尝试使一些端点使用 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 中取出并以编程方式对其进行配置。