in the short term getting your entities reattached with GetClone() or
Merge() or something like that will have the lowest impact on your
current architecture.
However, this should only be a short term solution.

Anne makes a good point that if you are going to cache your domain
entities, NH 2nd level cache would be a better choice. However jumping
straight to cache isn't always the best solution. Query optimization
can go a long way to reducing database calls and doesn't require any
form of caching. I would only use cache (NH or asp.net cache) as a
last resort.

I would also recommend having a distinct presentation model and domain
model.
from a conceptual POV you explicitly have all the information you need
to understand how the view works.
from a technical POV presentation is no long bound to the domain
model.
The presentation model can then be cached (only as a last resort) and
there is no need for cloning domain entities or attaching to session.
AutoMapper (on codeplex) makes converting the domain model to
presentation model effortless. Ayende has some examples of organizing
the presentation model on this blog.

On Mar 4, 7:12 am, Gautam <[email protected]> wrote:
> We had a similar problem where we wanted to store our objects in
> Session and Application variables and ViewState. We also had scenarios
> where objects had to be sent across application boundaries via
> remoting etc.
>
> We found that what worked for us is to implement GetClone() for all
> our domain objects.
>
> If a domain object had references to other domain objects, its
> GetClone() would in turn call GetClone() for all the referred domain
> objects. Though you need to ensure that there are no circular
> references.
>
> //when Saving
> Session["SomeVar"] = object.GetClone()
>
> //When retrieving
> object = (Cast)Session["SomeVar"];
> session.Lock(object); //Attach back to session
>
> Also it helps that Nhibernate Session methods like Save()
> automatically attach a detached object back to session.
>
> all said, I am not sure if this is the best way to go, and would sure
> love to hear some better ideas from the community.
>
> On Mar 4, 1:58 am, hankor <[email protected]> wrote:
>
> > Hi all,
>
> > I currently need to refactor a big web application using an ORM
> > framework. I would really like to use nhibernate for this & have done
> > several tests that show that things would work out well. I have one
> > problem left though that is giving me headaches:
>
> > I want to use one session per request. I will have to use lazy-loading
> > a lot.
> > The application does at numerous places store things in the asp.net
> > session or the asp.net cache.
>
> > When the application now loads a lazy property for an object that has
> > been loaded from there, nhibernate throws - no suprise - a
> > lazyinitializationexception.
> > I know I have to reattach the item to the session first.
>
> > BUT, due to the sheer size of the application I can't modify/review
> > all places where that happens (which I know in an ideal world I would
> > have time to do).
>
> > So my question is: Is there any way to intercept the lazy-loading and
> > check for an existing session previously and reattach if there is
> > none?
> > For lazily loaded properties I think I could modify the intercept
> > method of the generated proxy.
> > What would I do for lazily loaded collections (where
> > abstractpersistentcollection throws the exception) though?
>
> > The only thing I could come up with so far is to use a AOP framework
> > like postsharp to intercept the calls, but this would be kind of a
> > pain too because this would have to be integrated into the general
> > build process.
>
> > Any suggestions for easier ways to solve this?
>
> > Any help is much appreciated & sorry in case this already is answered
> > somewhere that I didn't find.

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to