У меня возникли проблемы с реализацией optimisitc-параллелизма в NHibernate значимым образом в веб-приложении. Вот желаемый сценарий:Оптимистическая параллелизм вне сессии в NHibernate
- Пользователь А открывает форму для редактирования записи
- пользователя B открывает ту же форму для редактирования той же записи
- Пользователь A Сохраняет свои данные
- Пользователь B пытается сохраните их данные, но получите предупреждение о том, что данные были обновлены.
Общий сценарий. Вот обновление кода и объект отображение файл:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Entities" assembly="Domain">
<class name="Record" />
<id name="Id" column="Id" type="long">
<generator class="identity"/>
</id>
<version name="Version" column="Version" type="datetime" />
<property name="Description" column="`Description`" type="string" />
</class>
</hibernate-mapping>
public void Edit(int id, string description, DateTime version)
{
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
var record = session.Get<Record>(id);
record.Version = version;
record.Description = description;
session.Update(record);
tx.Commit();
}
}
Значение версии загружаются, когда пользователь открывает форму и хранится в скрытом поле. Я надеялся, что NHibernate попытается обновить версию из формы в предложении WHERE, но вместо этого использует значение, которое оно только что загрузило в сеанс.
Другие вещи, которые я прочитал, говорят мне, что я должен сравнивать значения и (например) вызывать исключение, если он загружает более новую версию. Но я не могу поверить, что есть лучший способ.
Мне кажется, что элементы управления параллелизмом NHibernate полезны только в одном сеансе и поэтому совершенно бесполезны, когда дело доходит до данных устаревших форм в веб-приложениях.
Я хочу, чтобы иметь возможность вручную устанавливать версию в зависимости от того, что было в форме, когда пользователь первоначально загрузил ее. Это возможно? Или я чего-то не хватает?