2010-11-05 15 views
16

Me gustaría actualizar una entidad y todas sus colecciones secundarias. ¿Cuál es la mejor manera de hacer esto? Estoy hablando de nhibernate :)Cuál es la mejor manera de actualizar entidades en nhibernate

He leído sobre session.Evict, session.Refresh ...

Pero todavía no estoy seguro de si hacerlo como:

RefreshEntity<T>(T entity) 
{ 
session.Evict(entity); 
session.Refresh(entity); 
} 

haría funciona exactamente como quiero que funcione

¿Va a funcionar? Si no, ¿qué más puedo hacer?

Respuesta

23

Actualizar después de Expulsar probablemente no funcione.

Teóricamente, Refresh solo debería ser suficiente. Sin embargo, ha tenido problemas cuando se eliminaron los elementos de colecciones secundarias.

Evict seguido de Get por lo general hace las cosas.

+0

Siento decir esto, pero que no funciona :(Se trabaja en este escenario: 1) pEntity.pCollection está vacía 2) agrego un elemento de recogida en la base de datos manualmente 3) Puedo ver firmware colección pero eso no quiere trabajar en este escenario: 1) pEntity.pColelction tiene un valor 2) cambio de un valor de un elemento en la base de datos manualmente pEntity.pCollection 3) después de actualizar todavía tengo los mismos artículos en pEntity .pCollection ... – Katalonis

+1

Refrescar solo debería funcionar en ese escenario ** si ** pCollection cascades. De lo contrario, debe actualizar manualmente sus elementos también. –

+0

'Refresh' solo parece ser suficiente para mí para ambas adiciones y elimina una colección perezosa en una entidad. Un enlace a cualquier problema o advertencia conocida sería útil si hay casos especiales que debería tener en cuenta. –

2

Actualizar (parentObject) sería una buena opción, pero para mí, primero fue a buscar a todos los niños uno por uno con solicitudes individuales. Sin lotes, sin subconsulta, sin unirse. ¡Muy mal!

Ayudó a .Clear() la colección secundaria del objeto primario; También desalojé los objetos del niño antes.

(estos cambios se modificaron mediante una actualización de HQL antes de que las inserciones múltiples de Parent/children SaveOrUpdate causaran costosas reconstrucciones de índices en clúster).

EDIT: Eliminé la actualización de HQL nuevamente, ya que la consulta (índice de disminución por un único, gran número) era más cara que cientos de actualizaciones de fila única en un lote. Así que terminé en un simple SaveOrUpdate (parentObject), sin necesidad de actualizar.

La razón era una colección secundaria con restricción única en ParentID e índice (número secuencial), lo que daría como resultado violaciones de singularidad al actualizar los elementos modificados de elementos secundarios. Por lo tanto, el índice primero se incrementó en 1000000 (o un número alto arbitrario) para todos los niños, luego, después de los cambios, se disminuyó nuevamente.

Cuestiones relacionadas