2009-04-12 15 views
18

Ho alcuni tipi di entità che vorrei caricare pigro. Tuttavia, hanno alcuni campi interni (di assemblaggio) che espongono, ma non sono usati al di fuori di quella classe. Questi campi sono generati dal compilatore (F #) e non posso cambiarli. L'eccezione è un esempio:Ignora i campi pubblici/interni per il proxy NHibernate

NHibernate.InvalidProxyTypeException: I seguenti tipi non possono essere utilizzati come proxy: Mappings.MTest: campo id @ 47 non dovrebbe essere pubblico né interno

I capire perché NHibernate sta facendo questo, e come avere campi, se li ho acceduti, rovinerebbe le proprietà lazy-loading dei proxy che vengono generati. Tuttavia, poiché so che non userò i campi, posso in qualche modo scavalcare NHibernate?

C'è un modo per dire "ignora questo campo"? Sto usando Fluent NHibernate, se questo lo rende più facile.

Edit: Vorrei anche notare, sto usando NHibernate 2.1.0 Alpha 2.

Edit2: L'essenza principale è che voglio mantenere LazyLoading abilitato, il che significa che devo usare la generazione di proxy . La disabilitazione di LazyLoading funziona (nessun proxy), ma in qualche modo sconfigge lo scopo di un buon framework come NHibernate.

risposta

16

ho rimontata NHibernate (più facile che ottenere l'origine e la ricostruzione) e rimosso il codice che gli errori sui campi interni/pubblici. LazyLoading sembra funzionare bene senza quell'assegno. (Anche se, Sono nuovo di NHibernate e quindi probabilmente ci sono scenari che non conosco circa.)

Edit: Ah, c'è una proprietà, "use_proxy_validator" che consente di disattivare tutti i controlli di convalida. Abbastanza buono.

Fluently.Configure() 
    .ExposeConfiguration(fun cfg -> 
     cfg.Properties.Add("use_proxy_validator", "false"))... 
+1

lavori ! per Spring.Net è possibile aggiungerlo a "HibernatedProperties" '' –

0

Si potrebbe dare un'occhiata a this page che offre una panoramica dell'uso di F # con Fluent NHibernate.

Modifica Ho appena notato il tuo nome utente. Ho ragione a pensare forse che questo è il tuo blog? Che sciocco da parte mia. Sembra che risolva il problema, in particolare "Iniziamo disabilitando LazyLoad perché la maggior parte delle proprietà non sono virtuali e NHibernate non riuscirà a convalidare la mappatura, ma ci occuperemo esplicitamente delle cose LazyLoad, come il riferimento Store."? Forse sto solo fraintendendo il problema.

+0

Questo è esattamente il problema. Ora ho creato proprietà virtuali, ma non ho modo di rendere privati ​​i campi di supporto. Non voglio disabilitare il caricamento lazy, voglio che l'NHibernate t lo faccia solo :). Non vedo alcun motivo tecnico per cui non funzionerà, a parte questo controllo prudente che ha. – MichaelGG

+0

Suppongo che abbia più a che fare con il fatto che i proxy non possono nemmeno essere generati in primo luogo se ci sono membri non virtuali poiché è necessariamente una sottoclasse che sovrascrive tutti i membri. Purtroppo non sono abbastanza familiare con F # per offrire consigli specifici. –

+0

Possono, non possono ignorare i campi, ovviamente. Vedi la mia risposta. – MichaelGG

1

È possibile utilizzare l'attributo

[XmlIgnore] 

per decorare i campi :)

+0

Per NHibernate? Lo ha ignorato e si è ancora schiantato. – MichaelGG

+0

Stranamente: S l'ho usato io stesso per lo stesso tipo di problema. Forse è perché usi FluentNHibernate .. – cwap

+0

Oh che schifo :(. Sarebbe una soluzione carina. (Anche se, non posso effettivamente mettere attributi su questi campi). Hai un riferimento a qualsiasi documento che mostra cosa controlli XmlIgnore in NHibernate? Grazie! – MichaelGG

1

È possibile utilizzare un'interfaccia per dichiarare i campi "utilizzati"? http://nhibernate.info/doc/nh/en/index.html#persistent-classes-poco-sealed

"Un'altra possibilità è per la classe per implementare un'interfaccia che dichiara tutti i membri pubblici"

Non so se NH utilizzare lo stesso @transient annotazione/attributo come la versione Java di ignorare una proprietà in operazioni persistenti.

+0

F # non ha un'implementazione implicita dell'interfaccia e il campo effettivo ha un nome generato dal compilatore. Ma mi piace pensare. – MichaelGG

Problemi correlati