I’m creating a simple Windows Forms application with NHibernate and I’m a bit confused about how I’m supposed to use it. To quote the manual:
ISession (NHibernate.ISession)
A single-threaded, short-lived object representing a conversation between the application and the persistent store. Wraps an ADO.NET connection. Factory for ITransaction. Holds a mandatory (first-level) cache of persistent objects, used when navigating the object graph or looking up objects by identifier.
Now, suppose I have the following scenario:
I have a simple classifier which is a MSSQL table with two columns – ID (auto_increment) and Name (nvarchar). To edit this classifier I create a form which contains a single gridview and two buttons – OK and Cancel. The user can nearly directly edit the table in the gridview, and when he hits OK the changes he made are persisted to the DB (or if he hits cancel, nothing happens).
Now, I have several questions about how to organize this:
- What should the lifetime of my
ISessionbe?
Should I create a singleISessionfor my whole application; an ISession for each of my forms (the application is single-threaded MDI); or an ISession for every DB operation/transaction? - Does NHibernate offer some kind of built-in dirty tracking or must I do this myself? The manual mentions something like it here and there but does not go into details.
- How is this done?
- Is there not a huge overhead?
- Is it somehow tied with the cache(s) that NHibernate has?
- What are these caches for?
- Are they not specific to a single
ISession? That is, if I use a seperateISessionfor every transaction, won’t it break the dirty tracking? - How does the built-in dirty tracking detect deleted objects?
Several questions address this:
NHibernate has built-in dirty tracking.
In a nutshell, an EntityEntry keeps the state of the entity when it is loaded, then when the session is flushed this loaded state is compared to the actual state. Fields/properties with differing values are marked as dirty. It’s actually much more complex than this, but as a user you don’t need to know exactly how it works.
No. It’s only a concern if you’re managing a huge amount of entities in a single session (something you shouldn’t do anyway)
It seems that you’re confusing dirty tracking, caching and concurrency. Caching and concurrency are highly configurable, these articles explain them very well:
Dirty tracking behavior can be overriden as well, but the default behavior is appropriate for 99% of the cases.