2010-07-14 17 views
5

Cuando actualizo (con un color) un registro en una lista de registros recuperados de la base de datos nHibernate está versionando todos los registros que estaban en la lista original.NHibernate actualiza los registros sin cambios

Recuperar una lista de registros de la base de datos:

using(UnitOfWork.Start()) 
{ 
    queuedJobs = aJobServiceManager.GetAllJobs().Where(aJob => aJob.Status == PricingStatus.QUEUED).ToList(); 
} 

/* Do some work on the record*/ 
using(UnitOfWork.Start()) 
{ 
    //aJob is a record from queuedJobs. 
    aJobServiceManager.Save(aJob); 
    //When Flush is called I'm expecting only aJob to be updated in the database. 
    //aJob is correctly updated BUT 
    //All the other records in queuedJobs are also updated (their version field is incremented). 
    UnitOfWork.Current.Flush(); 
} 

¿Por qué es NHibernate actualizar todos los registros cuando no han cambiado y cómo detener este comportamiento?

+1

¿UnitOfWork.Start() crea una nueva sesión de NHibernate? –

Respuesta

9

Esto es muy probablemente el problema que se está ejecutando en: http://nhforge.org/blogs/http://nhibernate.info/blog/2008/10/20/how-test-your-mappings-the-ghostbuster.html

Sería de gran ayuda para ver el archivo de asignación de trabajo. Si estás haciendo algo así como

<property name="Status" type="int" /> 

Dónde Status es en realidad StatusEnum que va a terminar con el efecto fantasma.

+0

So Flush() intenta escribir todos los objetos "sucios" en la base de datos y no solo aquellos en los que explícitamente he llamado "Guardar()"? – brainimus

+0

Sí. Pero lo que significa "sucio" puede ser un poco confuso. Por ejemplo, tiene Job.Status que se almacena como supongo que un entero en la base de datos, pero es una enumeración en el modelo de objetos. NHibernate verá esta diferencia como "sucia" incluso si los valores coinciden. –

+1

Desafortunadamente, en este momento no puedo publicar todo el archivo de mapeo ya que contiene ítems sensibles. Puedo decir que el ejemplo de la propiedad Status que tienes es lo que tenía. Desde entonces, he cambiado la asignación para que apunte a un campo int en mi clase de trabajo y la propiedad se encarga de convertir esto en la enumeración. Puede valer la pena observar que el trabajo contiene una bolsa de otros objetos que usaron la misma enumeración pero también he hecho que la actualización del archivo de mapeo sea un campo en la clase y una propiedad convierta el campo a la enumeración. Todavía tengo el mismo problema. – brainimus

Cuestiones relacionadas