Se avete un legacy database dove alcuni processi fanno manipolazioni del database al di fuori del vostro controllo potreste trovarvi in una situazione in cui l’entità A referenzia l’entità B con una many-to-one, e quindi la tabella dove viene salvata l’entità A ha una foreign-key verso la tabella B.
Supponiamo inoltre che la tabella A sia stata introdotta in un momento successivo, e ci sono processi che cancellano record dalla tabella usata per salvare l’entità B, lasciando quindi i record di A orfani. In questa situazione NHibernate genererà un errore a runtime quando si tenta di accedere alla relazione di una entità orfana, perchè il lazy load non riesce a caricare la corrispondente entità B, pur avendo un id nella colonna della foreign-key.
Una possibile soluzione è utilizzare l’opzione not-found=”ignore”, la quale permette di dire a nhibernate di ignorare questa situazione, se nella tabella dell’entità A ci sta un riferimento ad una entità B che non è più presente, si può ignorare questo errore, e lasciare la corrispondente proprietà di navigazione a null.
Questa però è una soluzione poco efficiente per molte ragioni. La prima è che NHibernate effettuerà sempre la query per tentare di recuperare l’entità B correlata, quindi ogni volta che caricate una entità A viene sempre fatta una ulteriore select per capire se la corrispondente Entità B esiste, quindi non viene più applicato il lazy load. Quando caricate liste di entità il problema potrebbe diventare anche peggiore.
La soluzione in questo caso è una sola, fare in modo che il database non abbia foreign-key orfane, perchè avere una base dati di questo tipo è veramente molto pericoloso, quindi se avete dei processi fuori dal vostro controllo, non dimenticate la ON DELETE SET NULL, che permette di mantenere l’integrità referenziale in maniera automatica, e quindi evitando di dover ricorrere a delle opzioni “pericolose” di NHibernate.
Alk.