2011-12-11 8 views
8

La lógica de negocio dentro de un proceso es:Nhibernate - artículo consigue su ParentID actualizado a null en lugar de eliminarse

  • iniciar la transacción
  • agregar un elemento a una colección
  • realizar una búsqueda ("somethingA ")
  • elimine ese elemento según el paso anterior.
  • confirmar la transacción

Im usando en cascada todas-delete-huérfanos, y la inversa = true, tanto en mi clase padre. Al eliminar el elemento de la colección, configuro .parentObj = null y elimino el elemento de la colección.

Al utilizar TemplateFlushMode.Auto, que perfila la base de datos y se hace lo siguiente:

  • Insertar elemento
  • SELECT relacionados tosomethingA
  • ACTUALIZACIÓN parentID (FK al padre) del artículo a NULL

(el elemento de inserción se realiza debido a que un find() se hace, para garantizar la consistencia de los datos en la base de datos). La selección se hace, y entonces esperaría que se realice un DELETE ... pero se ha realizado una actualización a parentID = null.

Al realizar una Session.Flush() justo antes de la Find(), ocurre lo siguiente:

  • Insertar elemento
  • SELECT relacionados tosomethingA
  • Eliminar elemento

Al utilizar TemplateFlushMode.Commit, los cambios se realizan al final de la transacción y el artículo nunca se inserta:

  • SELECCIONAR relacionados tosomethingA

La aplicación que estoy trabajando está utilizando TemplateFlushMode.Auto, por lo que me pregunto, ¿hay una explicación de por qué la cascada no funciona si se realiza un Select en medio de una el artículo se agrega y luego se elimina en la misma transacción?

Sé que la primera respuesta que aparece es "no agregue un elemento a una colección, si se eliminará después". Pero prefiero no cambiar la lógica de negocios.

¿Alguien sabe por qué se está realizando una actualización en lugar de delete al usar AUTO? (cuando se utiliza Commit no inserta el objeto)

+0

Hola Adrián, buena pregunta, tengo la misma pregunta que en realidad. – san983

+1

¿podría mostrar el mapeo? – giammin

+0

¿Puedo preguntar qué estás tratando de lograr con esto? puede ser una solución diferente. – ivowiblo

Respuesta

0

¿Está utilizando un enlace bidireccional de uno a muchos? ¿Ha marcado not-null="true" en la clave externa en la tabla details? ¿Puede publicar su archivo XML de asignaciones para una mejor comprensión?

Sé que no he respondido su pregunta, pero no tengo suficiente reputación para publicar un comentario.

1

Creo que se debe utilizar la opción cascade="delete" en su archivo de asignación con el fin de borrar en cascada en

Cuestiones relacionadas