让我先来介绍背景:ASP.NET的ObjectDataSource控件和NHibernate会话管理
在.NET C#项目,我用NHibernate的让C#对象和数据库模型之间的联系。我用NHibernate Mapping Attibutes来映射我的对象。
我已经写在HQL数据访问的查询,他们都在单独的方法,其装饰与事务管理属性被孤立。这里是我的数据访问类什么样子:
namespace MyProject.DataAccess
{
public class ClientDao
{
private ISessionFactory sessionFactory;
public ISessionFactory SessionFactory
{
protected get { return sessionFactory; }
set { sessionFactory = value; }
}
protected ISession CurrentSession
{
get { return sessionFactory.GetCurrentSession(); }
}
[Transaction(TransactionPropagation.Required, IsolationLevel.ReadCommitted)]
public IList<Client> GetAll()
{
return CurrentSession.CreateQuery("from Client c").List<Client>();
}
}
}
我和春天有个配置NHibernate的会话和事务管理。下面是XML配置:
<!-- NHibernate Configuration -->
<object id="NHibernateSessionFactory" type="GeSuiPro.Abstract.ExtendedSessionFactoryObject, GeSuiPro.Abstract">
...
<property name="HibernateProperties">
...
</property>
<!-- provides integation with Spring's declarative transaction management features -->
<property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>
<!-- Transaction Management Strategy - local database transactions -->
<object id="transactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate21">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
</object>
<tx:attribute-driven transaction-manager="transactionManager"/>
<!-- Exception translation object post processor -->
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/>
现在,当我尝试访问从C#代码的会议,一切工作正常:
IList<Client> list = clientDao.GetAll();
然而,到了“GETALL”方法的一些电话是通过ObjectDataSource控件对象从ASP代码所做的:
<asp:ObjectDataSource ID="odsClient" runat="server" TypeName="MyProject.DataAccess.ClientDao"
SelectMethod="GetAll" DataObjectTypeName="MyProject.Object.Client" />
当我GETALL方法访问的“CurrentSession”对象,我得到以下错误: “无休眠SESS离子绑定到线程,配置不允许在这里创建非事务性的配置“。 看来我的配置中缺少某些东西。
有关信息,我使用NHibernate 2.1.2 NET 3.5框架。我的数据库是Oracle 11g。
任何帮助,将不胜感激!
感谢您的回复。我不认为这个解决方案是合适的,因为我已经定义了一个交易管理器。我可能是错的,但似乎这个解决方案只能用于JUnit。此外,我的问题是通过来自ASP.NET代码的调用访问NHibernate会话,因为它可以从C#代码中正常工作。 – Hal 2010-07-29 12:29:53