2009-07-19 14 views

Respuesta

67

Capítulo 9 cubre todo esto mejor que yo:

http://nhibernate.info/doc/nh/en/index.html

Pero Cliff Notes:

Save() toma un nuevo objeto sin un identificador y se une a la sesión. El objeto será INSERT 'd.

Update() toma un objeto existente que tiene un identificador pero no está en la sesión y lo conecta a la sesión. El objeto será UPDATE 'd.

SaveOrUpdate() mira el identificador y decide lo que es necesario en lo anterior.

SaveOrUpdateCopy() es especial porque dice que tiene dos objetos con el mismo identificador: uno en la sesión y otro no. Si intenta y update, el que no está en la sesión, se lanza una excepción normalmente (ahora está tratando de adjuntar dos objetos que representan el mismo objeto persistente a la sesión). SaveOrUpdateCopy() copia el estado del objeto sin sesión al estado del objeto de sesión.

No estoy seguro de cómo vas a usar NH, pero para muchos casos todo lo que necesitas es Save(). La sesión está haciendo TODO el trabajo necesario para saber qué tiene que actualizarse y simplemente Flush() o Commit() hace todo lo que necesita.

+2

Normalmente no necesita SaveOrUpdate() porque NHibernate realiza un seguimiento de los cambios en cada objeto cargado. Para actualizar un objeto use Session.Get(), haga que cambie y luego llame a Session.Flush(). –

+0

¿Qué es más legible o intención revelador en el código a continuación: 'SaveOrUpdate()' o 'Flush()'/'Commit()'? ¿O no hace una diferencia (semántica o de otro tipo)? –

+0

Es probable que no sea necesario enjuagar explícitamente su sesión. Si realiza una transacción o la sesión queda fuera de alcance/se descarta, los cambios se conservarán automáticamente (o antes si es necesario, por algún motivo, generación de id o similar). Flush es revelador de intenciones (para mí) cuando * necesitas * para forzar los cambios automáticamente, debido a la ioslación de lectura o algún otro esoterismo, y solo al ruido de lo contrario. Cualquiera que esté familiarizado con NH entenderá la 'Actualización' implícita de las entidades adjuntas también, por lo que tiendo a pensar lo mismo de las declaraciones explícitas' SaveOrUpdate' también. –

Cuestiones relacionadas