Есть ли альтернатива 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 за исключением того, что для версионных сущностей это приводит к принудительному увеличению версии.

Другие вопросы по тегам