Some of the wording on the NHibernate Session functions can be a tad misleading, or hard to understand. One is ‘Update’, Update in many ways should be called ‘Attach’! So, let’s review what Update does:
Session.Update
This sounds like something you call to ‘save’ something right? Actually it’s not. The ‘save’ occurs on Save/Commit/Flush. ie.
using var tran = new Transaction
Order order = Session.GetById(…)
order.Updated = true;
Session.Update(order) <— not needed
tran.Commit()
Update is actually for ‘tracking’ – not saving. Let’s say you have an object that is detached from a session – by calling Update on that object will tell NHibernate to start tracking the object again.
ie let’s say we get Order from the HttpSession…
Order order = Session[“Orderâ€] as Order;
Session.Update(order)
tran.Commit()
So, in summary ‘Update’ is for re-associating an object back to the the NHibernate session. Here is the catch as well – it is telling NHibernate that it is expecting it to be ‘saved’. You can use Lock and define a LockMode to tell NHibernate that a ‘save’ might not be required.
In a test simulating a n-tier environment, I did detach (Evict) the object, then call ‘Update’ and ‘Lock’, it was able to save the object. I plan on seeing how to work with optimistic concurrency.
What I find interesting is how badly Linq to Sql appears to handle this vs. NHibernate. This is what I’m researching at the moment, so if anyone has advice in this area let me know.