Позвольте мне описать контекст первого:ObjectDataSource в ASP.NET и управления NHibernate Session
В проекте .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 и управление транзакциями с помощью Spring. Вот конфигурация 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» являются сделанный из кода ASP через объекты ObjectDataSource:
<asp:ObjectDataSource ID="odsClient" runat="server" TypeName="MyProject.DataAccess.ClientDao"
SelectMethod="GetAll" DataObjectTypeName="MyProject.Object.Client" />
при обращении к «CurrentSession» объекта в моем методе GETALL, я получаю следующее сообщение об ошибке: «Нет Hibernate Sess ион, связанный с потоком, а конфигурация не позволяет создавать не транзакционные данные здесь ». Кажется, что-то отсутствует в моей конфигурации.
Для получения информации я использую .NET 3.5 Framework с NHibernate 2.1.2. Моя база данных - Oracle 11g.
Любая помощь будет оценена!
Спасибо за ваш ответ. Я не думаю, что это решение подходит, так как я уже определил менеджера транзакций. Возможно, я ошибаюсь, но похоже, что это решение должно работать только с JUnit. Более того, моя проблема заключается в доступе к сеансу NHibernate с вызовом из кода ASP.NET, поскольку он отлично работает с кодом C#. – Hal