1
votes

We are using Spring.NET for Dependency Injection and NHibernate as ORM. We use Session Per Request Model and the session is created using Spring.NET. In one of the page, There is a webservice call. When the web service call throws EndPointNotFoundException exception, the NH Session gets closed and we get 'Lazy Initialization exception : 'failed to lazily initialize a collection of role: , no session or session was closed(We have a Person objects, that gets loaded in the page load, but the Person objects has set of lazily loaded collections like addresses etc. the error is thrown when one of the lazily loaded collection is accessed). If the exception is not thrown,everything works correctly. Is there a quick solution?

1
Why does the NH session get closed on a web service error? - Thilak Nathen
:) That is what I am trying to figure out. Once the exception is thrown, I get the error 'no session or session was closed'. - RAM
The quick solution is "Don’t Query from the View" and load the needed objects eager in your db-layer. nhprof.com/learn/alerts/QueriesFromViews - Andreas
You need to provide more details on what sort of querying you're trying and where you're calling the web service. - Thilak Nathen

1 Answers

0
votes

More information is required but i'll try to make a calculated guess:

The exception thrown is not handled, or if handled is re-thrown. The exception propagates to the page error handler.

Either way somewhere along the exception bubble pipeline an exception handler calls ISession.Close() and then consumes the exception (and thus program execution continues via the rendering of the page)

This is not uncommon and usually when doing a rollback on the transaction it is advised to also close the ISession.

Note, that a rollback+close may be performed on a failed commit, in which case the failed webservice call somehow pollutes your object state and thus the commit fails. Again the exception is handled and consumed.

The nitty gritty detail is that some code-path that contains proxied nhibernate entities still gets to execute and tries to reference the closed ISession