¿Cuál es el mejor enfoque para actualizar solo las propiedades modificadas en NHibernate cuando se desconecta la sesión?


Estoy trabajando en el proyecto que usa NHibernate. No mantengo la sesión abierta. Cuando necesito obtener o guardar un objeto, abro la sesión, hago lo que necesito y luego cierro la sesión. Así que todo el tiempo estoy trabajando con objetos separados de la sesión.

Por ejemplo, cuando necesito obtener un objeto de la base de datos, abro la sesión y luego llamo a la sesión.Get() y cerrar la sesión. Luego actualizo algunas propiedades del objeto separado. Cuando necesito guardar cambios en la base de datos, llamo al método que abre sesión, llama a sesión.Actualizar (myObject) y cierra la sesión.

Pero cuando lo hago, NHibernate genera sql que actualiza todos los campos que he mapeado, aunque no hayan cambiado. Mi sugerencia es que cuando objects se separa de la sesión, NHibernate no pudo rastrear los cambios realizados. ¿Qué enfoque utiliza cuando desea actualizar solo las propiedades que se han cambiado para el objeto separado de la sesión? ¿Cómo hacer un seguimiento de los cambios para los objetos?

Gracias

 24
Author: Sergey Smelov, 2009-08-07

2 answers

La pregunta es: ¿por qué quieres hacer esto? Creo que no es una gran optimización si solo actualiza las columnas que han cambiado.

¿Tienes disparadores en la base de datos?

Si es así, puede hacer lo siguiente:

  • utilice select-before-update="true" y dynamic-update="true" en la asignación. Esto hace que NH realice una consulta antes de la actualización y solo actualice si ha cambiado, y solo las columnas que han cambiado. No estoy seguro si selecciona para cada actualización, o solo si no está en el sesion.
  • use Merge en lugar de actualizar. Esto hace realmente lo mismo: selecciona la entidad de la base de datos, solo si no está ya en la sesión. Utilice también dynamic-update="true". También hay una compensación: Merge devuelve la instancia adjunta si ya hay una en la sesión. Por lo tanto, siempre debe desechar la instancia que pasó y trabajar con la instancia desde la que va Merge.

En realidad no me importarían las columnas actualizadas. Su más probablemente más rápido para actualizarlos ciegamente en lugar de realizar una consulta anterior.

 17
Author: Stefan Steinegger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-07 09:10:04

Utilice dynamic-update="true" en la asignación .
Además para actualizar el objeto separado use esto:

Session.SaveOrUpdateCopy(myObject)
 6
Author: Dmytrii Nagirniak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-07 07:22:31