+1  A: 

If the objects were loaded in the same session, then the session is keeping track of changed objects and update only the changed ones. But in your case the objects are not associated with this session.

You could track the changed objects yourself and save or update the changed ones. NHibernate cannot help you there.

Or you could try and implement Session per Conversation pattern and keep the objects in one session over multiple requests.

As a side note you could use the ISession.SaveOrUpdate(Object) method instead of the if statement. The session will do it for you ;).

Bojan Milenkoski
It seems like a more disconnected way...so a session per conversation wouldn't do. How do we handle tracking changes when passing NH entities over the wire, e.g. WCF? It's like the same scenario IMHO.
Hadi Eskandari
There are few ways of tracking the changes. You could wrap the objects and add a field(s) denoting changes for the entities. Or you can hold the ids of the changed objects in a collection(s). The second way is better for you (I think). You can even hold references to the changed objects in a collection(s) (essentially mimicking session per conversation, but without the session). A lot of ways to do this...
Bojan Milenkoski