NHibernate Session Management Advice

905 views Asked by At

I need some advice on NHibernate Session Management for a C# WinForms application.

I am currently porting an application to use NHibernate. I am also employing a UnitOfWork pattern as described in the link below;

http://nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx

My question relates to Sessions.

  1. Can you only have one session running per thread at all times?

  2. I have a scenario in which a Session (UnitOfWork) may be open for a form shown by the application but the user opens another form (i.e. Tools - Options) which I would like to have its own UnitOfWork. Clearly in this instance it would make more sense to open another Session for the "Tools - Options" form and not use the currently open session for the underlying form.

  3. Can we have a Dictionary of Sessions on the one thread?

Any advice on session management is appreciated.

2

There are 2 answers

0
Jay On

1 - You can have as many sessions as your use case requires.

2 - That's fine, based on 1.

3 - You can put the session variables in a dictionary or any other collection.

What you shouldn't do unless you really know what you're doing and why is:

  • use the same session in more than one thread
  • pass entities from one session/UoW to another
  • attempt to reuse a session that has thrown an exception (don't do this even if you think you know what you are doing)
0
James Kovacs On

+1 on what Jay said. I would also recommend reading Oren Eini's article on Building a Desktop To-Do Application with NHibernate:

http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

It uses WPF as the UI technology, but everything he says (wrt NHibernate in desktop apps) is equally relevant for WinForms.