2010-12-14 15 views
7

Según la documentación NHibernate, las sentencias SQL se emiten en el orden siguiente cuando una sesión se vacía:fin Nhibernate de sentencias SQL al lavar sesión

  • todas las inserciones de la entidad, en el mismo orden los objetos correspondientes se guardan utilizando ISession.Save()
  • toda entidad actualiza
  • todas las eliminaciones de recogida
  • todos los elementos de recogida de eliminaciones, actualizaciones e inserciones
  • todo insertio colección ns
  • todas las eliminaciones de la entidad, en el mismo orden se suprimieron los objetos correspondientes usando ISession.Delete()

¿Por qué es obligado en este orden y ¿hay alguna manera de cambiarlo de manera que las sentencias se ejecutan en el mismo orden en que los doy?

+0

Estoy intrigado por esto. ¿Por qué quieres un orden diferente? ¿Qué intentas lograr? – Rippo

+0

Ok, sin entrar en demasiados detalles, tengo una tabla de muchos a muchos (con un pk compuesto) que intento eliminar primero y luego reinsertar cuando guardo el documento principal; He establecido inverse = true en la colección principal, así que tengo que administrar el almacenamiento yo mismo, pero debido a que las inserciones suceden antes de las eliminaciones, obtengo una violación de restricción si necesito volver a guardar una parte antigua de muchas en muchas. Solo he estado jugando con NH por un día más o menos, todavía estoy tratando de resolver los detalles. – LMC

Respuesta

3

Está en ese orden porque es el más seguro.

Y no, no puede cambiar el orden. Pero también, nunca le has dado a NHibernate ningún pedido: simplemente marcas entidades para persistencia; NHibernate determina qué hacer automáticamente.

Si cree que necesita más control sobre las operaciones de SQL individuales, puede usar IStatelessSession en lugar de . Pierde todo lo que NH hace automáticamente (carga lenta, almacenamiento en caché, seguimiento sucio), pero puede (debe) decir explícitamente cuándo Insert, Delete o Update un registro.

+0

Ok gracias Diego, eso tiene sentido entonces. – LMC

+0

Probablemente sea el más seguro, pero debe recordarlo en cada paso del proceso e incluso una inserción normalmente simple, delete-> se vuelve complicada. (Para los registros con una propiedad/columna única en el borrado, el botón Guardar no funcionará). – mayu

0

No puede cambiar el orden en el que NHibernate genera SQL por el anterior, pero puede dividir las unidades de trabajo.

por ejemplo:

using(var transaction = Session.BeginTransaction()) 
{ 
    var company = Session.QueryOver<Company>().First(); 
    var employee = new Employee{ ID = Guid.NewID() }; 
    company.Employees.Add(employee); 
    Session.Flush();  

    var carSpace = new CarParkingSpace { EmployeeID = employee.ID }; 
    Session.Save(carSpace); 

    transaction.Commit(); 
} 

Mediante la adición de la Session.flush() - todo a ese punto será empujado a la transacción. Sin él, NHibernate intentaría crear un espacio de estacionamiento asignado a un empleado que aún no existe.