Есть ли альтернатива ISession.Merge (), которая не выдает при использовании оптимистической блокировки? - PullRequest
1 голос
/ 27 июля 2011

Я пытался использовать ISession.Merge (), чтобы сохранить согласованность между двумя сеансами, но это не удается, когда объединенный экземпляр имеет более высокое свойство Version, чем то, которое загружено в сеанс (с исключением StaleObjectStateException).

Есть ли альтернативный метод, который бы работал, если поля версии не совпадают?

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Кажется, нет никакого способа безопасно объединить объекты между сеансами, по крайней мере, с оптимистической блокировкой.

Я иду по другому шаблону: каждый сеанс имеет свои собственные копии каждой сущности, и я refresh() экземпляров в каждом сеансе по мере необходимости. Это добавило накладных расходов при использовании памяти и обращений к БД, но, похоже, работает.

0 голосов
/ 28 июля 2011

Попробуйте позвонить:

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

...