2011-06-22 3 views
7

Sto cercando di utilizzare lazy loading per una proprietà di uno dei miei soggettiNon disponibile per: Castle.Proxies. <EntityName> Proxy e lazy = "true" in NHibernate?

La mappatura proprietà è qualcosa di simile:

<property name="Foobar" type="AnsiString" column="FOOBAR" lazy="true"/> 

Tuttavia quando ho Tring per salvare un'istanza di questa entità (usando LINQ), getta un DatabaseQueryException con la seguente eccezione interna:

NHibernate.MappingException: No persister per: Castle.Proxies.FooEntityProxy "

E quando rimuovo i pigri =" vero "oggetto, l'eccezione non viene più lanciata. Qual è il problema con l'utilizzo di lazy = "true" e come risolvere questo problema?

+0

Che cosa è successo a quella proprietà nella sessione, È stato caricato o no? L'hai modificato nella sessione? –

+0

E 'NH2 ou NH3? – Pedro

+0

@Pedro Assembly Version è 3.1 –

risposta

2

Se si seleziona una proprietà come pigro, è deve essere un auto virtuale matic proprietà (senza corpo come public virtual MyType Baz { get; set; }). Se si tenta di accedere al valore del campo sottostante, anziché passare attraverso la proprietà, si eluderà il caricamento lento della proprietà e si potrebbero ottenere risultati imprevisti.

+1

cos'è una proprietà automatica virtuale? –

+1

Una proprietà virtuale senza corpo, ad es. 'public virtuale SomeType Foo {get; impostato; } ' –

4

So che questa è una risposta tardiva, ma ho avuto lo stesso problema in precedenza. Stavo usando un intercettore personalizzato per creare i proxy, e così ho scoperto che il problema era che non avevo sovrascritto il metodo "GetEntityName". Analizzare il proxy all'interno del metodo GetEntityName e restituire il nome corretto della classe ha funzionato.

Nel mio caso, ho avuto un metodo semplice estensione per unproxy miei oggetti, chiamati "UnProxy", quindi tutta la mia implementazione di questo metodo si presentava così:

public override string GetEntityName(object entity) 
{ 
    if (entity == null) 
     return base.GetEntityName(entity); 
    return entity.UnProxy().GetType().FullName; 
}