2009-06-22 8 views

risposta

17

lazy = "proxy" indica che NHibernate inizializzerà lentamente le istanze della classe; Quando NHibernate recupera un'istanza della classe dal database, in questo caso non restituirà un'istanza "reale" della classe, ma piuttosto fornirà un proxy. Cioè, restituirà un oggetto che è di un altro tipo, più specificamente, un oggetto che è una sottoclasse della tua classe (generata da NHibernate attraverso la generazione di IL).

L'oggetto che verrà fornito, è un proxy e l'unica proprietà popolata è la proprietà Id. Non appena si chiama un'altra proprietà sull'istanza, NHibernate inizializzerà il proxy e recupererà dal database tutte le altre proprietà/raccolte (ad eccezione di quelle che sono pigre caricate).

Lazy = "true" viene utilizzato su un altro livello. Mentre lazy = "proxy" è usato a livello di classe, lazy = "true" è usato a livello di raccolta. Significa che la raccolta dovrebbe essere pigra.

+0

E qual è la differenza per lazy = "true" allora? –

+1

Sembra che tu non abbia risposto alla domanda. – gdoron

9

Il documentation reference dice che il valore dell'attributo proxy è in:

lazy="proxy|no-proxy|false" 

pigri (opzionale - il default è di proxy): Per impostazione predefinita, le associazioni singolo punto sono proxy.

lazy = "no-proxy" specifica che la proprietà deve essere recuperata pigramente quando si accede per la prima volta alla variabile di istanza (richiede la strumentazione bytecode build-time).

lazy = "false" specifica che l'associazione verrà sempre recuperata con entusiasmo.

+0

Non dovrebbe lazy = "proxy" specificare che la proprietà deve essere recuperata pigramente quando si accede per la prima volta alla variabile di istanza –

+1

Ulteriori informazioni possono essere trovate sul blog di ayende: http://ayende.com/Blog/archive/2010/01/ 28/nhibernate-new-feature-no-proxy-associations.aspx –

+0

L'ho appena riformattato in modo che le opzioni siano su linee di differenza. –

22

ho il sospetto un altro modo di pensare che sarebbe stato così.

class Foo 
{ 
    public virtual Bar SingleBar { get; set; } 
    public virtual ICollection<Bar> MultiBar { get; set; } 
} 
  • lazy = "proxy" si applica agli oggetti singoli (cioè foo.SingleBar)
  • lazy = "true" si applica a collezioni di oggetti (cioè foo.MultiBar)

(Non puoi impostare lazy = "proxy" su una raccolta, né puoi impostare lazy = "true" su un singolo riferimento, altrimenti l'NH genererà una XmlSchemaException che è un po 'criptica per i principianti.)

Operativamente fanno lo stesso abstr atto cosa: quando e solo quando si accede alla proprietà, NHibernate colpisce il database e popola la proprietà.

C'è tuttavia una leggera differenza nell'implementazione a causa di ciò che è necessario per recuperare gli oggetti (nel singolo caso, l'id del riferimento (Barra) è stato caricato con l'entità padre (Foo). sono sconosciuti e devono essere trovati in un'altra tabella)

+0

Nell'app che stavo lavorando c'era una differenza tra "proxy" e "true". Nel caso in cui la chiave esterna avesse un valore che non era presente nella tabella associata lazy = "true" ha gettato ObjectNotFoundException durante la query di Linq mentre lazy = "proxy" ha funzionato come previsto. –