2010-03-05 13 views
6

El escenario es el siguiente,nhibernate no Eliminar en cascada los niños

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

mapeo es el 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 cascada eliminar todo el camino a través del niño del niño. Pero lo que sucede actualmente es esto.

(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 puede insertar un valor nulo' error con cascada e inversa. Espero que esto borre todo con este código, pero solo se está eliminando el padre.

¿Extrañé algo en mi mapeo que probablemente se perderá? ¡Cualquier sugerencia en la dirección correcta es más que bienvenida!


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

Fui con la eliminación de 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 del niño

<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> 

de los 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> 

Esperamos que esto ayude a las personas con el mismo problema!

Respuesta

6

Al establecer on-delete="cascade" en las teclas, está dejando que el DB maneje la cascada.

¿Está generando su esquema con NHibernate?

Acabo de reproducir su ejemplo y funcionó bien con y sin ese atributo. Al eliminarlo, NHibernate realiza la cascada.

Por cierto, usar lazy="false" fetch="subselect" no es algo que deba hacer de forma predeterminada. Si elimina esos atributos, deje on-delete="cascade" y cambie cascade al save-update, solo tendrá dos consultas para recuperar y eliminar un elemento primario.

Cuestiones relacionadas