Qual è l'impatto di lazy = "false" sull'elemento di classe della mappatura NHibernate?

StackOverflow https://stackoverflow.com/questions/606488

  •  03-07-2019
  •  | 
  •  

Domanda

Sto lavorando con un sistema legacy a cui sto sperimentando l'aggiunta di NHibernate. Ho classe che devo mappare su una tabella, ma ha molti metodi esistenti che non sono virtuali.

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

Comprendo il significato del caricamento non pigro su raccolte che appartengono a un oggetto, ma non sono chiaro sul significato di quale caricamento pigro o desideroso su una classe sarebbe. 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 è la migliore linea d'azione qui? L'impostazione di quel valore pigro = falso non è consigliabile? Devo creare un'interfaccia implementata dalla classe e quindi mapparla sulla tabella? O dovrei solo mordere il proiettile e contrassegnare tutti i metodi esistenti sulla classe virtuale?

Grazie in anticipo per qualsiasi consiglio!

È stato utile?

Soluzione

Specifico 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 'pigro' nella mappatura della classe (impostazione predefinita), NHibernate utilizza una classe 'Proxy dinamico' in fase di esecuzione. 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, dal momento che 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. :)

Altri suggerimenti

L'uso del caricamento lento è 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 abbiano 1 o più ruoli. Quando si carica l'oggetto Utente, si desidera caricare anche tutti i ruoli associati. Tuttavia, quando carichi i ruoli per quell'utente, non vorrai caricare tutti gli utenti associati a quel ruolo perché ciò potrebbe finire con il caricamento dell'intero database di utenti.

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

Rob, Questo è solo un cattivo design. L'utente avrà un elenco di tipo Ruolo ma il ruolo non avrà un 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 a 2 vie come hai descritto formano un modello di dominio orribile. "Riferimenti circolari" di Google e scopri perché è dannoso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top