2009-08-24 22 views
6

Tengo una clase autorreferencial. Un niño tiene una referencia a su padre y un padre tiene una lista de hijos. Dado que la lista de niños está ordenada, intento mapear la relación usando NHibernate.Nhibernate - La lista de asignación no actualiza los índices de lista

Esta es mi mapeo:

<class name="MyClass"> 
    <id name="Id"> 
    <generator class="native"/> 
    </id> 
    <list name="Children" cascade="delete" inverse="true"> 
    <key column="ParentId"/> 
    <index column="ListOrder"/> 
    <one-to-many class="MyClass"/> 
    </list> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

El problema que estoy teniendo es cuando tener un hijo mapeo bidireccional < -> padre, el índice de la lista (ListOrder) no se actualiza en la base de datos cuando Hago mi danza CRUD. Esto significa que cuando yo, por ejemplo, eliminar un niño, tengo agujeros en la lista de niños después de guardar en la base de datos y buscar el padre de nuevo. Si elimino la bidireccionalidad, al no tener un número de varios de los hijos con el padre (y no inverso = verdadero), ListOrder se actualiza correctamente.

¿Alguno de ustedes ha visto esto antes? ¿Hay alguna solución simple?

+0

su debido a la inversa = true, no está seguro de cuál es la mejor solución es, sin embargo, tener exactamente el mismo problema en este momento. estad atentos –

+0

Sí, es por inverso = verdadero. Si se elimina el bidir, todo funciona como me gustaría, ListOrder-wise. La cuestión es que tengo que implementar la propiedad de los niños yo mismo, lo que no quiero. –

Respuesta

5

Sí, es una solución alternativa usar un conjunto o bolsa en lugar de list con order = "ListOrder", agregue la columna ListOrder como propiedad a la clase MyClass con un setter vacío y un getter que siempre devuelve su índice de la colección hija de sus padres. De esta manera:

<class name="MyClass"> 
    <id name="Id"> 
     <generator class="native"/> 
    </id> 
    <bag name="Children" cascade="delete" inverse="true" order-by="ListOrder"> 
     <key column="ParentId"/> 
     <one-to-many class="MyClass"/> 
    </bag> 
    <property name="ListOrder" column="ListOrder"/> 
    <many-to-one name="Parent" class="MyClass" column="ParentId"/> 
</class> 

y la clase

public class MyClass 
{ 
    public virtual int ID { get; set; } 
    public virtual IList<MyClass> Children { get; set; } 
    public virtual MyClass Parent { get; set; } 

    public virtual int ListOrder 
    { 
     get 
     { 
      if (Parent == null || !Parent.Children.Contains(this)) return -1; 
      return Parent.Children.IndexOf(this); 
     } 
     set { } 
    } 
} 
+3

Gracias por su sugerencia. En mi código de hoy, utilizo ganchos al agregar/eliminar elementos secundarios para establecer ListOrder correctamente. Básicamente, estoy trabajando con NHibernate que no funciona como esperaba al agregar lógica en mi dominio. Su sugerencia es otra solución de capa de dominio. Puede ser mejor que el mío, pero sigue siendo una solución. Si la semántica de mi lista es una lista, quiero asignarla como una lista, no como una bolsa ordenada. –

+0

Me gusta la idea de propiedad –

Cuestiones relacionadas