Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Evitate se possibile NHibernate not-found=”ignore”

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.

Print | posted on giovedì 20 giugno 2013 00:07 | Filed Under [ NHibernate ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET