NHibernate: изменение различных полей объекта из двух сессий - PullRequest
3 голосов
/ 12 апреля 2011

У меня есть объект с несколькими полями.Есть два типа действий, которые могут быть выполнены над ним: длинное, обычно инициируемое пользователем, и короткое, которое периодически запускается системой.Оба они обновляют сущность, но затрагивают разные поля.

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

Я думаю, что отслеживание изменений NHibernate должно помочь, то есть, если один сеанс загружает объект и обновляет некоторые поля, а другой - тот же объекти обновляет разные поля, тогда два не будут сталкиваться.Однако я чувствую, что не должен полагаться на это, потому что это звучит как «оптимизация» или «детали реализации».Я склонен рассматривать отслеживание изменений как оптимизацию для уменьшения трафика базы данных, я не хочу, чтобы функциональность системы зависела от него.Кроме того, если я когда-нибудь решу реализовать оптимистический параллелизм для этой сущности, то я рискую получить исключение StaleObjectException, даже если могу гарантировать, что в действительности нет коллизии.

Каков наилучший способ добиться этого?Должен ли я разделить сущность на две части?Разве это не может повлиять на согласованность базы данных (например, что если в БД находится только одна «половина» сущности)?Могу ли я использовать NHibernate, чтобы явно установить только одно поле объекта?Я ошибаюсь, не желая полагаться на отслеживание изменений для достижения функциональности?

Если это имеет значение, я использую Fluent NHibernate.

1 Ответ

2 голосов
/ 12 апреля 2011

Вы можете отобразить объект, используя dynamic update.

  • dynamic-update (необязательно, по умолчанию false): указывает, что SQL UPDATE должен генерироваться во время выполнения и содержать только те столбцы, значения которых изменились.

Если вы включите динамическое обновление, у вас будет выбор оптимистических стратегий блокировки:

  • version проверить столбцы версии / метки времени
  • all проверить все столбцы
  • dirty проверить измененные столбцы
  • none не использовать оптимистическую блокировку

Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...