2009-03-06 12 views
18

Sto utilizzando NHibernate per estrarre alcuni dati da un db legacy e ho trovato diversi casi in cui è presente una chiave esterna, ma la riga di riferimento è stata rimossa.È possibile evitare NHibernate.ObjectNotFoundException quando è presente una chiave esterna ma la riga di riferimento non esiste?

Quando faccio il mio mappatura NHibernate (utilizzando Fluent NHibernate in questo modo:

References(d => d.Group) 
    .WithColumns("groupId", "dataset") 
    .SetAttribute("lazy", "true"); 

ottengo un proxy non inizializzate per Group quando si carica l'oggetto principale, seguito da un ObjectNotFoundException quando tento di usarla

.

se disattivo caricamento lazy, ottengo un ObjectNotFoundException immediatamente quando si carica la radice

Pertanto:. c'è un modo per avere NHibernate rendere la Group nullo quando si carica la root? O è possibile controllare il proxy unitializzato in qualche modo, per vedere se riuscirà a caricare la riga?

risposta

15

ho trovato la soluzione here - avevo bisogno di aggiungere

.SetAttribute("not-found", "ignore"); 

alla mappatura.

+6

Grazie per questa risposta. Avevo lo stesso problema. Grazie anche per avere un userid che prende il nome da una traccia di Aphex Twin. A proposito, nella mia versione di FluentNH è .NotFound.Ignore(). – David

+0

grazie per aver notato il nome utente;) – mookid8000

2
+0

Questo sembra promettente - ma seeems ho accesso solo il nome del soggetto mancante e - molto strano - quello che sembra essere un esempio a caso dell'entità manca? Sai come usare questa interfaccia? – mookid8000

+0

Non l'ho provato, ma dovresti ottenere il nome dell'entità e l'id, vedi http://fisheye3.atlassian.com/browse/nhibernate/trunk/nhibernate/src/NHibernate/Proxy/IEntityNotFoundDelegate.cs?r=3007 –

+0

Questa è l'implementazione predefinita, quella che lancia ObjectNotFoundException: http://fisheye3.atlassian.com/browse/nhibernate/trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs?r=4091#l76 –

2

hai verificato che la tua proprietà di riferimento si sta ancora caricando pigramente? Affinché NHibernate carichi i riferimenti pigramente, è necessario assicurarsi che il riferimento NON sia NULL. Quando si imposta not-found = "ignore", si sta indicando indirettamente a NHibernate che esiste la possibilità che il riferimento non esista, impedendo quindi che il vincolo NOT NULL sia valido. Nel caso che hai descritto sopra, non incontrerai un errore ma potresti osservare una chiamata entusiasta al database per caricare il tuo Gruppo.

0

Sulla applicazione che sto lavorando sulla creazione

lazy="proxy" 

risolto il problema.

Problemi correlati