2010-07-06 10 views
10

Tengo dos clases:NHibernate: "colección no fue procesado por flush()" debida a un asunto carga diferida

class Parent 
{ 
    public virtual Child Child { get; set; } 
} 

class Child 
{ 
    public virtual IList<GrandChild> GrandChildren { get; set; } 
} 

He una instancia de Parent cargado de mi ISession, Parent.Child es cargado ligeramente (no cargado en este punto). Child.GrandChildren también está cargado de pereza.

Si hago esto:

session.Save(new Parent { Child = existingParent.Child }); 

consigo collection [Child.GrandChildren] was not processed by flush()

Si causo existingParent 's Child propiedad a ser cargado, simplemente accediendo a ella:

var x = existingParent.Child.Name 

el problema va lejos. ¿Por qué sucede esto y cómo lo resuelvo, preferiblemente sin tener que cambiar mi estrategia de búsqueda?

** Edición: ** Padres tiene una FK a Niño

estoy usando NH 2.1.2.4000

Gracias

+0

¿Encontró una solución que no implique tocar la colección? – bcsanches

+0

no lo crea así :( –

+0

a menos que "utilice un documento db, en su lugar" cuente –

Respuesta

0

¿Cuál es la configuración en cascada de cambios en cascada de niño a los nietos ¿colección? Creo que NHibernate arroja esta excepción si la colección está sucia, pero la configuración de cascada no hace que los cambios persistan.

+0

ive no ha realizado ningún cambio, por eso no está cargado? solo quiero hacer un nuevo 'padre', con el mismo hijo que un' padre' existente. cascada para hasone es ' saveupdate' y para hasmany es 'alldeleteorphan' –

+0

¿Estás inicializando la colección GrandChildren en el constructor de Child? Por favor, muestra las asignaciones. –

0

Puede usar session.Load para hacer referencia a una instancia existente de Child sin hacer un viaje a la base de datos. Esto debe hacerlo, pienso:

session.Save(new Parent { Child = session.Load(existingParent.Child.Id) }); 

pero comprueba para asegurarse de que la llamada .Id no desencadena un viaje db.

1

Tuve un problema similar, el comentario de @Jamie Ide me ayudó a darme cuenta de cuál era el problema. Estaba inicializando la colección dentro del constructor, lo que hizo que NHibernate pensara que la colección estaba sucia, incluso si no era necesario guardar ese objeto específico en ese punto.

La excepción que obtuve fue: Nombre de clase: ERROR | NHibernate.AssertionFailure: collection [CollectionName] no fue procesada por flush()

Aún quiero hacer esta inicialización, pero creo que tengo que encontrar alguna otra solución a ese problema.

Cuestiones relacionadas