L'interfaccia ISession di NHibernate mette a disposizione due metodi per recuperare una entity da DB a partire dal suo identificativo, ossia ISession.Get e ISession.Load.
La prima differenza che salta all'occhio è che, nel caso l'oggetto voluto non esista, Get ritorna una null-reference, mentre Load solleva una ObjectNotFoundException. Molto più importante, secondo me, è però il fatto che, nel caso in cui il tipo sia configurato come Lazy Initializable (quindi attributo Lazy="true" nel mapping della classe), Session.Load restituisce il proxy e non l'oggetto stesso.
E' un aspetto molto comodo tutte le volte in cui abbiamo bisogno di una reference ad un oggetto di cui non conosciamo altro che l'Id (ad esempio perché ci proviene da una DropDownList). L'uso di Session.Load, in questo caso, ci permette di ottenere questa reference senza passare per il database (o per la cache); ovviamente non sarà riferita all'oggetto vero e proprio, che non viene caricato finché non proviamo ad accedervi, però è comunque ritenuta valida da NHibernate ai fini della persistenza.
Attenzione, però, a due subdoli inconvenienti. Intanto se usiamo Session.Load non è assolutamente detto che il tipo restituito sia ciò che ci aspettiamo, quindi MAI fare un test del genere
myObject = session.Load<MyObjectType>(id);
if (myObject.GetType() == typeof(MyObjectType))
// do something
perché potrebbe avere risultati non predicibili; è molto più corretto scrivere
if (myObject is MyObjectType)
// do something
Inoltre bisogna sapere che, nel caso in cui l'oggetto sia configurato per il LazyLoad e l'id non esista, la ObjectNotFoundException verrà sollevata al primo utilizzo dell'oggetto stesso, e non in corrispondenza del metodo Session.Load.
Morale della favola: se si è ragionevolmente sicuri che l'id esista, usate pure Load. Ma se lo fate, state attenti perché è comunque più complesso da gestire.
Technorati tags:
NHibernate