Permettez-moi de décrire le contexte d'abord:ObjectDataSource de ASP.NET et NHibernate gestion de session
Dans un projet .NET C#, j'utilise NHibernate pour faire le lien entre les objets C# et le modèle de base de données. J'ai cartographié mes objets avec NHibernate Mapping Attibutes.
J'ai écrit des requêtes d'accès aux données dans HQL, tous étant isolés dans des méthodes individuelles, décorées avec des attributs pour la gestion des transactions. Voici comment mes classes d'accès aux données ressemblent à:
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>();
}
}
}
J'ai configuré la session NHibernate et la gestion des transactions avec le printemps. Voici la configuration 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"/>
Maintenant, quand je tente d'accéder à la session à partir du code C#, tout fonctionne bien:
IList<Client> list = clientDao.GetAll();
Cependant, certains appels aux méthodes "getAll" sont fait à partir du code ASP via des objets ObjectDataSource:
<asp:ObjectDataSource ID="odsClient" runat="server" TypeName="MyProject.DataAccess.ClientDao"
SelectMethod="GetAll" DataObjectTypeName="MyProject.Object.Client" />
Lorsque vous accédez à l'objet « currentSession » dans ma méthode de GetAll, je reçois l'erreur suivante: « Pas de mise en veille prolongée sess ion lié à fil, et la configuration ne permet pas la création de non-transactionnel ici ". Il semble que quelque chose manque à ma configuration.
Pour plus d'informations, j'utilise .NET Framework 3.5 avec NHibernate 2.1.2. Ma base de données est Oracle 11g.
Toute aide serait appréciée!
Merci pour votre réponse. Je ne pense pas que cette solution soit appropriée, car j'ai déjà défini un gestionnaire de transactions. Je peux me tromper, mais il semble que cette solution est de travailler avec JUnit seulement. De plus, mon problème est d'accéder à la session NHibernate avec un appel du code ASP.NET, car cela fonctionne très bien à partir du code C#. – Hal