在使用内存持久性进行开发之后,我试图让一些端点使用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中取出它并以编程方式对其进行配置。
答案 0 :(得分:2)
您可以在代码中轻松配置连接字符串:
busConfiguration.UsePersistence<NHibernatePersistence>()
.ConnectionString("your-connection-string-here");
您需要包含NServiceBus.Persistence
命名空间才能使扩展方法可用。
你是对的,NHibernate Persistence文档页面不仅仅包括设置连接字符串。我已opened a GitHub issue on the docs repository跟踪此事。