讓我先來介紹背景: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