Я хочу добиться проверки параллелизма с помощью nHibernate 3 с использованием шаблона UnitOfWork.
Чтобы быть более точным:
- открыть новый сеанс сеанса,
- загрузить объект в сеансе,
- закрытая сессия,
- дать пользователю некоторое время для редактирования данных в загруженном объекте,
- открыть новую сессию,
- обновить данные
- закрыть сеанс.
Я использую временную метку для версии объекта.
Вот мой файл сопоставления
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="...."
namespace="...."
default-lazy="false">
<class name="Employee"
optimistic-lock="version"
dynamic-update="true">
<id name="Id">
<generator class="native" />
</id>
<version column="LastEditDate" generated="always" type="timestamp" />
<property name="Name" not-null="1" length="255" />
<property name="LastEditUser" not-null="1" length="255"/>
</class>
</hibernate-mapping>
Я понятия не имею, как обновить сущность в контексте сеанса.
var entity = <updated by user>
using (var session = GetNewSession())
{
//todo: load current version value / attach entity to context
session.SaveOrUpdate(entity);
//if concurency check fails, StaleObjectException (or similar) is expected to be thrown
}
В SQL это должно работать так
UPDATE ENTITY SET LastEditDate = @P1, ... WHERE ID = @P2 AND LastEditDate = @P3
where:
@P1 - new LastEditDate
@P2 - entity ID
@P3 - previous LastEditDate
Если ROWSMODIFIED = 1, то обновление прошло успешно, иначе, если = 0, то ConcurrencyException
С помощью Linq2Sql это было очень просто: создайте столбец управления версиями, прикрепите сущность к новому контексту сеанса и попробуйте обновить.
Как я могу сделать это в nHiberate? Поддерживается ли он?