Подтвердить что ты не робот

Какой лучший способ обновить объекты в nhibernate

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

Я читал о сеансе. Ивент, session.Refresh...

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Это помогло. Очистить() дочернюю коллекцию родительского объекта; Я также вырезал дочерние объекты раньше.

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

EDIT: Я снова удалил обновление HQL, так как запрос (индекс уменьшения по уникальному большому числу) был более дорогим, чем сотни однострочных обновлений в пакете. Поэтому я оказался в простой SaveOrUpdate (parentObject), без необходимости обновлять.

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