11

Tengo una clase base abstracta y entidades poco heredadas. Estoy usando la tabla por herencia de subclase con la automatización fluida nhibernate 1.1.Problema con los proxies de Casting cuando se utiliza la tabla NHibernate por estrategia de herencia de subclase

La herencia de clases se parece a la siguiente

Nodo (clase abstracta) Lugar: Nodo Activos: Nodo clase Node

es básicamente una estructura de árbol.

public abstract class Node 
    { 
     public virtual int Id 
     { 
      get; 
      set; 
     } 

     public virtual Node ParentNode 
     { 
      get; 
      set; 
     } 

     public virtual ICollection<Node> ChildNodes 
     { 
      get; 
      set; 
     } 
} 

Ahora el problema es cuando consigo un objeto de la base de datos de activos y hacer objAsset.ParentNode, puedo echar a ParentNode activos o lugar, pero si lo hago algo así como objAsset.ParentNode.ParentNode.ParentNode, entonces el ParentNode aparece como del tipo "{Castle.Proxies.NodeProxy}" y no puedo convertirlo en Lugar o Activo.

Sé que en mi caso el resultado final debería ser de tipo Lugar, ya que el registro existe en la base de datos en la tabla Lugar pero por alguna razón NHibernate no puede cargarlo perezosamente al tipo derivado real, solo es moldeable al nodo de la clase base.

¿Alguna idea?

espera Nabeel

Respuesta

15

Esto se explica bien por Oren aquí: http://ayende.com/Blog/archive/2009/09/03/answer-the-lazy-loaded-inheritance-many-to-one-association-orm.aspx

En pocas palabras, los proxies heredan de la clase de la asociación, no el tipo hereditario, ya que no se conoce antes de ir a la base de datos (y no se puede cambiar el tipo de un objeto)

actualización: una posible solución está filtrando una referencia al objeto real en el nodo:

public virtual Node Self { get { return this; } } 

Eso le dará el activo o lugar subyacente. Ten cuidado con eso

+3

También, como se señala en el artículo; Una solución es desactivar la carga diferida en la asociación, que le dará el objeto real. – DanP

+0

Ver solución agregada –

+0

gracias deigo ... eso funciona muy bien. Lo único es que tuve que ignorar la propiedad Self en el mapeo. – nabeelfarid

Cuestiones relacionadas