Primo post dell’anno, sempre sul caro e “vecchio” NHibernate.
Oggi mi è capitata una situazione particolare, anche se ben codificata. Scenario molto semplice: entità con una reference ad un’altra entità. Nello specifico un preventivo collegato ad un cliente.
Il mapping che stavo utilizzando era questo:
1: <class name="Preventivo" table="Preventivi_Testate" lazy="true">
2: <id name="ID" type="Int32" unsaved-value="0">
3: <generator class="native" />
4: </id>
5: ...
6: ...
7: ...
8: <many-to-one name="Cliente" class="Cliente" column="IDAnagrafica" not-found="ignore"></many-to-one>
9: </class>
Apparentemente tutto corretto e infatti tutto funziona senza problemi.
Andando però a controllare le query che vengono generate da NHibernate si noterà che il lazy load sull’associazione Cliente non funziona e ogni volta che si recupera un Preventivo si va a fare una query anche per recuperare il Cliente. Questo anche senza accedere alla proprietà Cliente sul Preventivo.
Il problema è dovuto al parametro not-found=”ignore”. Rimuovendolo tutto torna a funzionare correttamente.
Il comportamento è in effetti legittimo e codificato. In presenza dell’attributo not-found=”ignore”, NHibernate deve restituire l’entità nel caso sia presente e Null (o Nothing) in caso l’entità non sia presente. Per fare questo l’unico modo è ovviamente quello di andare ad eseguire la query sul database. Nel caso in cui l’attributo not-found non sia specificato, NHibernate può tranquillamente istanziare un proxy ed eventualmente lanciare un’eccezione nel caso l’entità non sia trovata.
Attenzione quindi ad utilizzare l’attributo not-found=”ignore” perché vi potreste trovare con una moltitudine di query eseguite a vostra insaputa.