¿Cuál es la mejor manera de actualizar las entidades en nhibernate?
session nhibernate-mapping (2)
Me gustaría actualizar una entidad y todas sus colecciones secundarias. ¿Cuál es la mejor manera de hacer esto? Estoy hablando de inhibir :)
He leído sobre session.Evict, session.Refresh ...
Pero todavía no estoy seguro de si hacer como
RefreshEntity<T>(T entity)
{
session.Evict(entity);
session.Refresh(entity);
}
Funcionaría exactamente como quiero que funcione
¿Va a funcionar? Si no, ¿qué más puedo hacer?
Actualizar (parentObject) sería una buena opción, pero para mí, primero buscó a todos los niños uno por uno con solicitudes individuales. Sin lotes, sin subconsultas, sin unir. ¡Muy mal!
Ayudó a .Clear () la colección secundaria del objeto padre; También desalojé los objetos del niño antes.
(Estos cambios habían sido modificados por una actualización de HQL antes de que múltiples inserciones por parte de los padres / hijos, SaveOrUpdate, causaran costosas reconstrucciones de índices agrupados).
EDITAR: Retiré la actualización HQL nuevamente, ya que la consulta (índice de disminución por un número único y grande) era más costosa que cientos de actualizaciones de una sola fila en un lote. Así que terminé en un simple SaveOrUpdate (parentObject), sin necesidad de actualizar.
La razón fue una colección secundaria con una restricción única en ParentID e Índice (número secuencial), lo que daría lugar a violaciones de singularidad al actualizar los elementos secundarios modificados. Por lo tanto, el índice se incrementó primero en 1000000 (o un número alto arbitrario) para todos los hijos, luego, después de los cambios, volvió a disminuir.
Actualizar después de Evict probablemente no funcionará.
Teóricamente , la Refresh
solo debería ser suficiente. Sin embargo, tiene problemas conocidos cuando se han eliminado elementos de colecciones secundarias.
Evict
seguido de Get
generalmente hace las cosas.