2009-03-03 8 views
10

Sto lavorando con un sistema legacy che sto sperimentando con l'aggiunta di NHibernate. Ho classe che ho bisogno di essere mappato su una tabella, ma ha molti metodi esistenti che non sono virtuali.Qual è l'impatto di lazy = "false" sull'elemento di classe della mappatura di NHibernate?

Ho scoperto che posso ottenere NHibernate per caricare correttamente il mapping anche con i metodi non virtuali presenti se imposto l'attributo "lazy" sull'elemento classe del file di mapping su "false". Mi chiedo quale impatto avrà questo sul mio uso di NHibernate con questa classe.

Capisco il significato del caricamento non pigro sulle raccolte che appartengono a un oggetto, ma non sono chiaro sul significato di ciò che sarebbe il carico pigro o avido di una classe. Ciò significa che tutte le raccolte appartenenti a quell'oggetto sarebbero caricate con impazienza? O significa che NHibernate non utilizza più un proxy dinamico al posto della classe effettiva? Qualcos'altro?

Inoltre, qual è il modo migliore di agire qui? L'impostazione del valore lazy = false è sconsigliabile? Devo creare un'interfaccia che la classe implementa e quindi mapparla alla tabella? O dovrei mordere il proiettile e contrassegnare tutti i metodi esistenti sulla classe virtuale?

Grazie in anticipo per qualsiasi consiglio!

risposta

4

Specifica sempre lazy = false a livello di classe in NHIbernate, perché non voglio che NHibernate mi costringa a dichiarare che le proprietà devono essere virtuali, se non lo voglio nel mio modello di classe.

Quando si specifica 'lazy' nella mappatura della classe (predefinita), NHibernate utilizza una classe 'Dynamic Proxy' in fase di runtime. Questo proxy dinamico è una classe che eredita dalla tua classe. Quindi, per quanto ho capito, l'istanza della classe dovrebbe essere inizializzata pigramente/su richiesta. In alcuni casi, questo dovrebbe essere migliore per le prestazioni (almeno, questo è ciò che viene detto).

Ma, poiché non mi piace che NHibernate mi dica come dovrebbe essere la mia classe, ho sempre specificato lazy = false per tutte le mie classi, e non ho ancora avuto problemi. :)

+0

Quindi, per essere chiari prima di contrassegnare la risposta come accettata, l'impostazione lazy = false a livello di classe non causerà il caricamento di tali raccolte di classe? –

+0

No, l'attributo lazy a livello di classe non ha alcun impatto sull'attributo lazy ai livelli di raccolta. (Ho delle classi in cui specifico lazy = false a livello di classe e lazy = false a livello di raccolta) –

+0

Grazie, Frederik! Molto utile! –

2

L'utilizzo del caricamento lazy è molto efficace nel limitare il numero di oggetti. Questa funzione può essere estremamente utile in determinate situazioni. Ad esempio, immagina di avere due oggetti Utente e Ruolo e che tutti gli utenti hanno uno o più ruoli. Quando carichi l'oggetto Utente, vorresti anche caricare tutti i suoi ruoli associati. Tuttavia, quando carichi i ruoli per quell'utente, non vorrai caricare tutti gli utenti associati a quel ruolo perché potrebbe finire per caricare l'intero database degli utenti.

Quindi l'impostazione lazy = false indica che l'intera raccolta di oggetti per la relazione verrà caricata quando viene caricata l'istanza di chiamata. In alcune situazioni, ciò va bene, bene e appropriato, in altre situazioni, questo può portare a problemi di prestazioni.

+1

+1 per "in alcune situazioni". Recupero pigro o non pigro dovrebbe infatti essere definito per caso d'uso! – Hace

1

Rob, Questo è solo un pessimo design. L'utente avrà un elenco di tipo Ruolo ma il ruolo non avrà Elenco di tipo Utente. L'utente è una radice aggregata, per ottenere tutti gli utenti in un ruolo, definire un metodo su Utente per GetByRole(). Gli attraversamenti bidirezionali come quelli descritti descrivono un modello di dominio orribile. Google "riferimenti circolari" e vedere perché è male.

+1

Vedi collezioni inverse – Min

Problemi correlati