2009-05-01 13 views
13

Estoy realizando una actualización estándar en NHibernate a una sola propiedad. Sin embargo, en la confirmación de la transacción, la actualización sql parece establecer todos los campos que he mapeado en la tabla, aunque no hayan cambiado. Sin duda, este no puede ser el comportamiento normal en Nhibernate? ¿Estoy haciendo algo mal? GraciasActualización de NHibernate en propiedad única actualiza todas las propiedades en sql

using (var session = sessionFactory.OpenSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        var singleMeeting = session.Load<Meeting>(10193); 
        singleMeeting.Subject = "This is a test 2"; 

        transaction.Commit(); 
       } 
      } 
+0

acabo de encontrar la misma situación. Creo que este es un mal incumplimiento y buscaré discusiones en línea en los foros apropiados. esto ha causado errores en una aplicación de servidor en la que estoy trabajando, ya que cambia la lógica de la aplicación, generalmente en casos de acciones concurrentes donde se crea un objeto, luego se busca, se busca por otro hilo/proceso (sesión diferente), se modifica y se actualiza (actualizar campos separados no relacionados). la última actualización se ejecutará sobre los cambios en la transacción anterior ... He consultado esto con mis colegas y creemos que el aumento en el rendimiento no es drástico. –

+0

@YonatanKarni, esto no solo sobre el rendimiento sino también sobre la consistencia. Ver esta [pregunta] (/ q/13954882/1178314), y su [respuesta aceptada actualmente] (/ a/13955305/1178314). –

Respuesta

16

Este es el comportamiento normal. Puede intentar agregar dynamic-update="true" a su definición de clase para anular este comportamiento.

3

Bien. sí, este es el comportamiento normal de NHibernate. Puede usar el atributo generado para sus propiedades para cambiar el comportamiento. Detalles sobre Ayende's blog.

¿Por qué este valor predeterminado es porque con la dinámica no obtiene su plan de consulta en la memoria caché. Y generalmente no le importa que envíe algunos bytes más a través de la conexión de red de alta velocidad entre su servidor de aplicaciones y la base de datos. A menos que esté guardando cadenas largas donde esta configuración es perfectamente apropiada.

+0

Mientras está Generado significa que el campo no se enviará a través de una actualización, también significa que el campo se maneja en el lado del servidor. En cambio, NabilS está buscando los campos que se envían que han cambiado. –

+0

En realidad, esa publicación de blog no proporciona los detalles requeridos, ya que se relaciona con el nivel de Propiedad. La respuesta de @ Darin está en el nivel de clase, que es donde usted puede cambiar este comportamiento. – Jonno

Cuestiones relacionadas