2009-04-12 26 views
18

Tengo algunos tipos de entidades que me gustaría cargar de forma perezosa. Sin embargo, tienen algunos campos internos (de ensamblaje) que exponen, pero no se usan fuera de esa clase. Estos campos son generados por el compilador (F #) y no puedo cambiarlos. La excepción es un ejemplo:Ignorar los campos públicos/internos para el proxy NHibernate

NHibernate.InvalidProxyTypeException: Los siguientes tipos no pueden ser utilizados como sustitutos : Mappings.MTest: Identificación del campo @ 47 no debería ser público ni interna

I Entiendo por qué NHibernate está haciendo esto, y cómo tener campos, si los tuviera, arruinaría las propiedades de carga diferida de los proxies que se generan. Sin embargo, dado que sé que no usaré los campos, ¿puedo anular NHibernate de alguna manera?

¿Hay alguna manera en que pueda decir "ignore este campo"? Estoy usando Fluent NHibernate, si eso lo hace más fácil.

Editar: También debo señalar, estoy usando NHibernate 2.1.0 Alfa 2.

Edit2: La esencia principal aquí es que quiero seguir lazy loading habilitado, lo que significa que tengo que usar la generación de proxy . Deshabilitar los trabajos de LazyLoading (sin proxies), pero derrota el propósito de un buen marco como NHibernate.

Respuesta

16

que volver a montar NHibernate (más fácil que conseguir la fuente y la reconstrucción) y eliminado el código que los errores en los campos internos/públicas. LazyLoading parece funcionar bien sin ese control. (Aunque, soy nuevo en NHibernate y así probablemente hay escenarios que no conozco acerca.)

Editar: Ah, hay una propiedad, "use_proxy_validator" que desactiva todas las comprobaciones de validación. Suficientemente bueno.

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

this trabajos ! para Spring.Net puede agregar esto a "HibernatedProperties" '' –

0

Es posible que desee echar un vistazo a this page que proporciona una visión general del uso de F # con Fluidez NHibernate.

Editar Acabo de notar su nombre de usuario. ¿Estoy en lo cierto al pensar que este es tu blog? Que tonto de mi parte Sin embargo, parece abordar su problema, específicamente "Comenzamos desactivando LazyLoad porque la mayoría de las propiedades no son virtuales, y NHibernate no validará la asignación. En su lugar, explícitamente cargas LazyLoad, como la referencia de la tienda". Tal vez solo estoy malinterpretando el problema.

+0

eso es exactamente el problema. Ahora hice propiedades virtuales, pero no tengo forma de hacer que los campos de respaldo sean privados. No quiero deshabilitar la carga lenta, quiero que NHibernate simplemente lo soporte :). No veo ninguna razón técnica que no funcione, excepto por este control cauteloso que tiene. – MichaelGG

+0

Supongo que tiene más que ver con el hecho de que los proxies ni siquiera se pueden generar en primer lugar si hay miembros no virtuales, ya que es necesariamente una subclase que anula a todos los miembros. Lamentablemente, no estoy lo suficientemente familiarizado con F # para ofrecer algún consejo específico. –

+0

Pueden, simplemente no pueden anular los campos, por supuesto. Ver mi respuesta – MichaelGG

1

Usted puede utilizar el atributo

[XmlIgnore] 

para decorar los campos :)

+0

para NHibernate? Lo ignoró y aún se estrelló. – MichaelGG

+0

Weird: S Lo usé yo mismo para el mismo tipo de problema. Tal vez sea porque usas FluentNHibernate ... – cwap

+0

Oh, eso es una mierda :(. Sería una linda solución. (Aunque, en realidad no puedo poner atributos en estos campos). ¿Tiene alguna referencia a cualquier documento que muestre qué controles XmlIgnore? en NHibernate? Gracias! – MichaelGG

1

¿Se puede utilizar una interfaz para declarar los campos "usado"? http://nhibernate.info/doc/nh/en/index.html#persistent-classes-poco-sealed

"Otra posibilidad es que la clase para implementar una interfaz que declare todos los miembros públicos"

No sé si NH utilizan el mismo @Transient anotación/atributo que la versión de JAVA hacer caso omiso de una propiedad en operaciones persistentes.

+0

F # no tiene implementación de interfaz implícita, y el campo real tiene un nombre generado por el compilador. Pero me gusta pensar – MichaelGG

Cuestiones relacionadas