1

我从Spring.NET + NHibernate - Multiple (Distinct) Databases with OpenSessionInView中找到了一些提示,但它对我不起作用,需要你的帮助来确定出了什么问题。

我的项目基于 ASP.NET/Spring.NET(OpenSessionInView)/NHibernate,我们需要操作外部数据库,所以我们希望支持 OSIV 模式下的多数据源。

我们通过参考上述链接所做的事情:

(1)创建Spring.Data.NHibernate.Support.OpenSessionInViewModule的子类

namespace MyProject.Infrastructure.NHibernate
{
    public class ExtDbOpenSessionInViewModule : OpenSessionInViewModule
    {
    }
}

(2) 在 web.config 中配置 OSIV

这是我对 Spring.NET 和 NHibernate 集成的配置:

<!-- Spring Web Support and OSIV for NHibernate -->
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
<add name="OpenSessionInViewOnLocalDb" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/>
<add name="OpenSessionInViewOnExtDb" type="MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule, MyProject.Infrastructure"/>

<!-- NHibernate SessionFactory in OSIV-->
<appSettings>
    <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="LocalDbSessionFactory"/>
    <add key="MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule.SessionFactoryObjectName" value="ExtDbSessionFactory"/>
</appSettings>

当我们运行它时,系统说:

没有 Hibernate Session 绑定到线程,并且配置不允许在此处创建非事务性会话

我们发现任何 Repository 对象中的 SessionFactoryObject 都是空的。

日志是这样的:

2012-09-13 10:29:19,017 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 试图关闭 SessionScope
2012-09-13 10:29:19,018 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 只参与休眠会话 - 什么都不做
2012-09-13 10:29:19,030 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 参与现有的 Hibernate SessionFactory
2012-09-13 10:29:19,033 [14] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 参与现有的 Hibernate SessionFactory
2012-09-13 10:29:19,043 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 试图关闭 SessionScope
2012-09-13 10:29:19,055 [14] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 试图关闭 SessionScope
2012-09-13 10:29:19,062 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 只参与休眠会话 - 什么都不做
2012-09-13 10:29:19,071 [14] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 只参与休眠会话 - 什么都不做
2012-09-13 10:29:19,117 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 参与现有的 Hibernate SessionFactory
2012-09-13 10:29:19,122 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 试图关闭 SessionScope
2012-09-13 10:29:19,126 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 只参与休眠会话 - 什么都不做
2012-09-13 10:29:19,130​​ [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 参与现有的 Hibernate SessionFactory
2012-09-13 10:29:19,132 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 试图关闭 SessionScope
2012-09-13 10:29:19,132 [13] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 只参与休眠会话 - 什么都不做
2012-09-13 10:29:21,347 [14] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 参与现有的 Hibernate SessionFactory
2012-09-13 10:29:21,441 [14] 信息 Spring.Aop.Framework.AutoProxy.InfrastructureAdvisorAutoProxyCreator [(null)] - 候选顾问 [ObjectFactoryTransactionAttributeSourceAdvisor: 建议对象'Spring.Transaction.Interceptor.TransactionInterceptor#0'] 被拒绝目标类型 [ASP.pages_sysmgmt_debug_aspx]
2012-09-13 10:29:21,457 [14] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 试图关闭 SessionScope
2012-09-13 10:29:21,458 [14] 调试 MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - 只参与了休眠会话 - 什么都不做

哎呀!我们真的被它困住了。

4

1 回答 1

1

在询问了您所指的问题并使用基于它的解决方案超过 2 年之后,我也许可以为您提供帮助。

虽然不理想,而不是 subclass OpenSessionInViewModule,但您需要从 Spring.NET 的 source复制它。执行此操作时,请确保对默认构造函数进行了一次更改。它看起来像这样:

public MyOpenSessionInViewModule() : 
       base("appSettings", typeof(OpenSessionInViewModule), false)

基类调用的第二个参数的类型应该是您新复制的类 - 例如:

public MyOpenSessionInViewModule() : 
       base("appSettings", typeof(MyOpenSessionInViewModule), false)

除此之外,您问题上的其他所有内容似乎都是正确的。让我知道这是怎么回事。

于 2012-09-17T11:00:14.497 回答