2010-05-12 10 views
5

Dosis nHibernate funciona bien con eliminaciones en cascada de nivel de base de datos? Lo que quiero decir es que si tengo una restricción establecida en el nivel RDBMS para eliminar en cascada todos los huérfanos, ¿nHibernate invocará cualquier lógica de eliminación personalizada en el nivel de aplicación si tuviera que eliminar una entidad a través de nHibernate? ¿O debería eliminar las eliminaciones en cascada del nivel RDBMS y simplemente usar la función de eliminación en cascada de nHibernate definiendo ese comportamiento a través de su configuración?NHibernate: ¿funciona bien con eliminaciones en cascada de nivel de base de datos en restricciones de clave externa

Gracias

Respuesta

5

NHibernate simplemente trata a su RDBMS como almacén de datos. En la mayoría de los casos, esto significa que puede dejar que NHibernate haga el trabajo por usted.

Deje que NHibernate realice las eliminaciones en cascada. De esta manera puede mantener su lógica y control en su lugar (en su aplicación), en lugar de en la base de datos donde su aplicación tiene poco control o flexibilidad.

EDIT:

en Eliminar CASCADE no siempre exhiben un gran rendimiento con NHibernate. Debe tener mucho cuidado con los ajustes de cascada de sus asociaciones de colecciones. Ver este artículo: http://eddii.wordpress.com/2006/11/16/hibernate-on-deletecascade-performance/

A menos que el rendimiento sea un gran problema para usted, generalmente es más limpio y menos problemático dejar que NHibernate haga el trabajo. Jamie Ide señala correctamente:

Al igual que con los factores desencadenantes, NHibernate no sabrá que la representación de base de datos de un objeto ha cambiado debido a una operación de base de datos. Evitaría usándolos por este motivo en la mayoría de los casos .

+1

Esto no es óptimo. NHibernate sabe acerca de ON DELETE CASCADE (ver la respuesta de dotjoe) y puede usar eso para un mejor rendimiento (sin tener que hacer DELETE al borrar un padre) –

2

Puede funcionar con cascadas de nivel de base de datos. Puede declararlos en la asignación, por lo que la herramienta hbm2ddl generará el on delete cascade. La opción se encuentra en la propiedad de la colección key.

<bag ...> 
    <key column="someId" on-delete="cascade" /> 
... 
</bag> 
+0

de ninguna manera también para configurar 'on-update'? –

1

Depende de lo que quiere decir con "jugar bien". Puede usar eliminaciones en cascada con NHibernate, pero debe tener cuidado para actualizar los objetos que puedan verse afectados por las eliminaciones en cascada. Al igual que con los desencadenadores, NHibernate no sabrá que la representación de la base de datos de un objeto ha cambiado debido a una operación de base de datos. Evitaría usarlos por este motivo en la mayoría de los casos.

Cuestiones relacionadas