2009-08-17 12 views
8

¿Hay alguna manera en NHibernate para comenzar con un modelo unproxiedNHibernate actualización parcial

var m = new Model() { ID = 1 }; 
m.Name = "test"; 
//Model also has .LastName and .Age 

Ahora guarda este modelo sólo actualizar Nombre sin seleccionar primero el modelo de la sesión?

+0

actualizó mi respuesta un poco. –

Respuesta

2

Si el modelo tiene otras propiedades entonces el nombre, es necesario inicializar estos con el valor original en la base de datos, a menos que se establecerán en nulo.

Puede usar HQL update operations; Nunca lo intenté yo mismo.

También podría usar una declaración nativa SQL. ("Update model set name ...").

Por lo general, esta optimización no es necesaria. En realidad, hay casos excepcionales en los que debe evitar seleccionar los datos, por lo que escribir estas declaraciones SQL es solo una pérdida de tiempo. Está utilizando un ORM, esto significa: ¡escriba su objeto de software orientado! A menos que no obtenga muchas ventajas de eso.

0

http://www.hibernate.org/hib_docs/nhibernate/html/mapping.html

dinámica de actualización (opcional, por defecto false): Especifica que SQL UPDATE debe ser generado en tiempo de ejecución y contiene sólo aquellas columnas cuyos valores han cambiado .

Coloque la actualización dinámica en la clase en el HBM.

var m = new Model() { ID = 1 }; 
m = session.Update(m); //attach m to the session. 
m.Name = "test"; 
session.Save(m); 
+0

No estoy seguro en este momento si .Update llega a la base de datos, no lo quiero también. – bleevo

+0

Pruébalo. Lo más probable es que la actualización NO llegue a la base de datos de inmediato. Simplemente coloca el modelo en la sesión y lo marca como sucio que se almacenará de todos modos. –

+0

La actualización dinámica no funciona en este caso, ya que NH no tiene los valores originales y no sabe qué ha cambiado. Consulte esta pregunta: http://stackoverflow.com/questions/1243390/what-is-the-best-approach-to-update-only-changed-properties-in-nhibernate-when-se/1243739#1243739 –

1

Lo que dice Stefan parece lo que necesita. Tenga en cuenta que este es realmente un caso extremo y que debe estar contento con la carga completa de su entidad a menos que tenga algunos problemas de rendimiento ultra alto.

Si simplemente no desea acceder a la base de datos, intente utilizar el almacenamiento en caché, la memoria caché de entidades es muy simple y eficiente.

Si su entidad es enorme, es decir, contiene una burbuja o algo así, piense en dividirla en dos (con muchas para una, de modo que pueda utilizar la carga diferida).

Cuestiones relacionadas