Какой лучший способ обновить объекты в nhibernate
Я хочу обновить сущность и все ее дочерние коллекции. Каков наилучший способ сделать это? Я говорю о nhibernate:)
Я читал о сеансе. Ивент, session.Refresh...
Но я все еще не уверен, что делать:
RefreshEntity<T>(T entity)
{
session.Evict(entity);
session.Refresh(entity);
}
будет работать именно так, как я хочу, чтобы он работал
Будет ли это работать? Если нет, что еще я могу сделать?
Ответы
Ответ 1
Обновление после высева, вероятно, не будет работать.
Теоретически, только Refresh
должно быть достаточно. Однако он обнаружил проблемы, когда элементы дочерних коллекций были удалены.
Evict
, за которым следует Get
, обычно выполняется.
Ответ 2
Refresh (parentObject) будет хорошим вариантом, но для меня он сначала выбирал всех детей один за другим с помощью одиночных запросов. Нет дозаций, нет подзапросов, нет соединения. Очень плохо!
Это помогло. Очистить() дочернюю коллекцию родительского объекта; Я также вырезал дочерние объекты раньше.
(они были изменены с помощью обновления HQL до того, как несколько вставок родительскими/дочерними элементами SaveOrUpdate приведут к дорогостоящим перестроениям кластерных индексов).
EDIT: Я снова удалил обновление HQL, так как запрос (индекс уменьшения по уникальному большому числу) был более дорогим, чем сотни однострочных обновлений в пакете. Поэтому я оказался в простой SaveOrUpdate (parentObject), без необходимости обновлять.
Причиной была дочерняя коллекция с уникальным ограничением на ParentID и Index (порядковый номер), что приведет к нарушениям уникальности при обновлении измененных дочерних элементов. Таким образом, индекс был сначала увеличен на 1000000 (или произвольное большое число) для всех детей, а затем после изменений уменьшился снова.