Pregunta

El escenario es el siguiente,

Tengo 3 objetos (i simplificado los nombres) llamado Padres, hijo de padre e hijo del niño
niño de los padres es un conjunto de padres y niños del niño es un conjunto en el niño.

mapeo es la siguiente (partes pertinentes)

padres

<set name="parentset"
     table="pc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column=FK_ID_PC" on-delete="cascade"/>
  <one-to-many class="parentchild,parentchild-ns"/>
</set>

hijo de padres

<set name="childset"
     table="cc-table"
     lazy="false"
     fetch="subselect"
     cascade="all-delete-orphan"
     inverse="true">
  <key column="FK_ID_CC" on-delete="cascade"/>
  <one-to-many class="childschild,childschild-ns"/>
</set>

Lo que quiero lograr es que cuando se borra el padre, habría una eliminación en cascada a través de todo el camino a hijo del niño. Pero lo que ocurre actualmente es la siguiente.

(esto es puramente para fines de prueba mapeo) conseguir una entidad controladora (funciona bien)

IQuery query = session.CreateQuery("from Parent where ID =" + ID);
IParent doc = query.UniqueResult<Parent>();

Ahora la parte de borrado

session.Delete(doc);
transaction.Commit();

Después de haber resuelto el 'No se puede insertar valor nulo' error en cascada e inversa i espera que esto haría ahora de borrar todo con este código, pero se está eliminando sólo el padre.

¿Me he perdido algo en el mapeo de los cuales es probable que se pierda? Cualquier indicio en la dirección correcta es más que bienvenido!


Diego, gracias por la respuesta al punto. (Y explicación)

Me fue con la eliminación de la on-delete="cascade", esto porque me gusta tanto control como sea posible en el código y no en la base de datos.

El código publicado a continuación es el resultado (de trabajo).

padres

<set name="parentset"     
     table="pc-table"     
     cascade="all-delete-orphan"     
     inverse="true"
     batch-size="5">     
  <key column=FK_ID_PC"/>     
  <one-to-many class="parentchild,parentchild-ns"/>     
</set>

hijo de padres

<set name="childset"            
     table="cc-table"     
     cascade="all-delete-orphan" 
     batch-size="5"  
     inverse="true">            
  <key column="FK_ID_CC">            
  <one-to-many class="childschild,childschild-ns"/>            
</set>

Espero que esto ayuda a las personas con el mismo problema!

¿Fue útil?

Solución

Al establecer on-delete="cascade" en las teclas, usted está dejando el PP manejar la cascada.

¿Está generando su esquema con NHibernate?

Yo sólo reproduce su ejemplo y funcionó bien con y sin ese atributo. Al retirarlo, NHibernate hace la cascada.

Por cierto, utilizando lazy="false" fetch="subselect" no es algo que se debe hacer de manera predeterminada. Si elimina esos atributos, on-delete="cascade" licencia y el cambio cascade a save-update, sólo tendrá dos consultas para recuperar y eliminar un padre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top