Есть ли альтернатива ISession.Merge(), которая не выдает при использовании оптимистической блокировки?
Я пытался использовать ISession.Merge() для сохранения согласованности между двумя сессиями, но это не удается, когда объединенный экземпляр имеет более высокое свойство Version, чем загруженное в сеансе (с исключением StaleObjectStateException).
Есть ли альтернативный метод, который будет работать, когда поля версии не совпадают?
2 ответа
Кажется, нет никакого способа безопасно объединить объекты между сеансами, по крайней мере, с оптимистической блокировкой.
Я иду с другим шаблоном: каждый сеанс имеет свои копии каждой сущности, и я refresh()
экземпляры на каждой сессии по мере необходимости. Это добавило накладных расходов при использовании памяти и обращений к БД, но, похоже, работает.
Попробуйте позвонить:
Session.Lock(string entityName, object obj, LockMode lockMode);
с LockMode.Force. Замечания для этого состояния метода:
Это может быть использовано для проверки версии (NHibernate.LockMode.Read), для обновления до пессимистической блокировки (NHibernate.LockMode.Upgrade) или просто для повторной привязки временного экземпляра к сеансу (NHibernate.LockMode.None). Эта операция распространяется на связанные экземпляры, если сопоставление сопоставлено с помощью cascade="lock".
И для LockMode.Force:
Аналогичен NHibernate.LockMode.Upgrade за исключением того, что для версионных сущностей это приводит к принудительному увеличению версии.