2010-11-28 6 views
0

Utilisation de NHibernate avec ASP.NET 4.LazyInitializationException dans l'application ASP.NET avec NHibernate

J'ai eu aucun problème récupérer des objets, mais je dois juste un point avec des objets imbriqués que je ne peux pas comprendre .

J'utilise paresseux = true et quand l'accès à une collection charge paresseux je reçois le message:

Initializing[type#3]-failed to lazily initialize a collection of role: [type], no session or session was closed 

Même si je l'appelle sessionFactory.openSession() immédiatement avant l'objet accédée, il ça ne fait aucune différence. J'ai également essayé d'accéder à la collection dans un bloc ISession pour ne pas avoir de chance.

Modifier pour ajouter - J'ai current_session_context_class = web dans web.config, et j'utilise CurrentSessionContext.Bind sur BeginRequest.

Quelqu'un peut-il offrir quelques conseils?

Pas une application MVC

je lis ceci - ne sais pas comment elle est précise, et il est Hibernate: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2878

Il dit quelque chose au sujet d'un bug dans plusieurs à plusieurs des relations.

Voici ma carte HBM:

<bag name="Objects" table="ObjectInstance" cascade="all" lazy="true"> 
    <key column="branchId" /> 
    <many-to-many class="InventoryObjectInstance" column="objectInstanceId" /> 
</bag> 

Répondre

1

Est-ce que cela se produise après avoir effectué certaines opérations de sauvegarde/mise à jour? Où et quand fermez-vous la session? Pour moi, il semble que vous fermiez la session juste après l'enregistrement de l'appel ou dans une autre méthode avant que la page Web ne soit rendue. En d'autres termes, assurez-vous que vous utilisez Open Session in View pattern et fermez la session uniquement à la fin de la requête Web en cours. Vous pouvez également consulter ce post.

+0

Acclamations Denis. Non, il n'y a pas d'opération de sauvegarde, et comme je l'ai dit, même en créant explicitement une session avant l'appel me donne toujours cette exception. – Sam

+0

Vous ne devez pas rouvrir la session b/c dans ce cas, il s'agit d'une session différente qui ne peut pas être réutilisée dans les objets qui attendent la session OLD - vous devez conserver le même contexte de session dans le cycle de vie de la requête en cours. Vous avez juste besoin de localiser ces blocs de code (utilisations, appels explicites à la méthode .Close()) qui sont en train de fermer votre session et de la déplacer vers EndRequest dans Global.asax http://www.codeproject.com/KB/architecture/NHibernateBestPractices. aspx –

+0

Voir ici aussi - http: // communauté.jboss.org/wiki/OpenSessioninView –

0

Lorsque les graphiques d'objets sont récupérés, ils gardent une référence à la session qui les a engendrés. Ils utilisent cette session pour le chargement paresseux de leurs propriétés. Si la session d'origine est fermée, vous obtiendrez cette erreur (ou une erreur similaire) en essayant d'y accéder. Ouvrir une nouvelle session n'aidera pas.

Vous pouvez essayer de trouver où la session de demande d'origine est fermée et arrêter cela. Êtes-vous dans la même demande cependant? A défaut, vous pouvez essayer de connecter votre objet à une nouvelle session - je pense que c'est Session.Lock(YourObject). Vous pouvez également récupérer l'objet à partir de la nouvelle session.

+0

Toujours dans la même session, et j'ai fait une pause tout le code où la session est fermée et ne pas être déclenchée. – Sam

0

Pour une raison quelconque, vous obtenez une nouvelle session ISession lorsque vous appelez SessionFactory.OpenSession(). Votre première utilisation de l'accès à la session est-elle accessible dans un bloc using? Pourquoi appelez-vous OpenSession à nouveau - qu'est-il arrivé à la référence à la session?

Questions connexes