2009-06-22 17 views

Respuesta

17

lazy = "proxy" significa que NHibernate inicializará las instancias de su clase de forma lenta; Cuando NHibernate recupera una instancia de su clase de la base de datos, en este caso, no devolverá una instancia "real" de su clase, sino que le dará un proxy. Es decir, devolverá un objeto que sea de otro tipo, más específicamente, un objeto que sea una subclase de su clase (generada por NHibernate a través de la generación IL).

El objeto que se le dará, es un proxy, y la única propiedad poblada es la propiedad Id. Tan pronto como llame a otra propiedad en la instancia, NHibernate inicializará el proxy y recuperará todas las otras propiedades/colecciones (excepto aquellas que están cargadas de forma diferida) de la base de datos.

Lazy = "true" se utiliza en otro nivel. Mientras que lazy = "proxy" se usa en el nivel de clase, lazy = "true" se usa en el nivel de colección. Significa que la colección debe estar cargada de forma lenta.

+0

¿Y cuál es la diferencia con lazy = "true"? –

+1

Parece que no respondió la pregunta. – gdoron

9

El documentation reference dice que el valor del atributo de proxy está en:

lazy="proxy|no-proxy|false" 

lazy (opcional - por defecto es proxy): Por defecto, las asociaciones de punto único van con proxies.

lazy = "no-proxy" especifica que la propiedad debe buscarse de forma diferida cuando se accede por primera vez a la variable de instancia (requiere instrumentación de bytecode de compilación).

lazy = "false" especifica que la asociación siempre será buscada con entusiasmo.

+0

No debería lazy = "proxy" especificar que la propiedad debe buscarse perezosamente cuando se accede por primera vez a la variable de instancia –

+1

para obtener más información en el blog de ayende: http://ayende.com/Blog/archive/2010/01/ 28/nhibernate-new-feature-no-proxy-associations.aspx –

+0

Acabo de formatear eso para que las opciones estén en líneas de diferencia. –

22

sospecho otra forma de pensar en que sería así.

class Foo 
{ 
    public virtual Bar SingleBar { get; set; } 
    public virtual ICollection<Bar> MultiBar { get; set; } 
} 
  • lazy = "proxy" se aplica a los objetos individuales (es decir foo.SingleBar)
  • lazy = "true" se aplica a colecciones de objetos (es decir foo.MultiBar)

(No puede establecer lazy = "proxy" en una colección, ni puede establecer lazy = "true" en una sola referencia. O hará que NH arroje una XmlSchemaException que es un poco críptica para principiantes.)

Operationally ellos hacen lo mismo actuar: cuando y solo cuando se accede a la propiedad, NHibernate accede a la base de datos y completa la propiedad.

Sin embargo, hay una ligera diferencia en la implementación debido a lo que se necesita para recuperar los objetos (en el caso individual, la identificación de la referencia (Barra) se cargó con la entidad padre (Foo). son desconocidos y deben encontrarse en otra tabla)

+0

En la aplicación que estaba trabajando había una diferencia entre "proxy" y "verdadero". En caso de que la clave externa tuviera un valor que no estaba presente en la tabla asociada lazy = "true" lanzó ObjectNotFoundException durante la consulta de Linq mientras que lazy = "proxy" funcionó como se esperaba. –

Cuestiones relacionadas