Каков наилучший способ обновления сущностей в nhibernate? - PullRequest
17 голосов
/ 05 ноября 2010

Я хотел бы обновить сущность и все ее дочерние коллекции.Каков наилучший способ сделать это?Я говорю о nhibernate:)

Я читал о session.Evict, session.Refresh ...

Но я все еще не уверен, что делать так:

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

будет работать именно так, как я хочу, чтобы оно работало

Будет ли это работать?Если нет Что еще я могу сделать?

Ответы [ 2 ]

25 голосов
/ 05 ноября 2010

Обновление после Evict, вероятно, не будет работать.

Теоретически , Refresh одного должно быть достаточно. Тем не менее, были известные проблемы, когда элементы дочерних коллекций были удалены.

Evict, за которым следует Get, как правило, добиваются цели.

3 голосов
/ 14 ноября 2012

Refresh (parentObject) был бы хорошим вариантом, но для меня он сначала выбирал всех детей по одному с помощью одного запроса. Нет пакетирования, нет подзапроса, нет объединения. Очень плохо!

Помогло .Clear () дочерней коллекции родительского объекта; Я также выселил дочерние объекты раньше.

(они были изменены обновлением HQL раньше, когда множественные вставки родительским / дочерним элементом SaveOrUpdate вызывали бы перестроения дорогих кластерных индексов).

РЕДАКТИРОВАТЬ: Я снова удалил обновление HQL, поскольку запрос (уменьшение индекса на уникальное большое число) был дороже, чем сотни однострочных обновлений в пакете. Таким образом, я попал в простой SaveOrUpdate (parentObject), без необходимости обновлять.

Причиной была дочерняя коллекция с уникальным ограничением на ParentID и Index (порядковый номер), что приводило к нарушениям уникальности при обновлении измененных дочерних элементов. Таким образом, индекс сначала был увеличен на 1000000 (или произвольно большое число) для всех детей, а затем после изменений снова уменьшился.

...