Как свойства обновления NHibernate должны отображаться как версия
Используя свободный NHibernate, у меня есть свойство для класса, отображенного с помощью Version
Version(x => x.Version);
Когда я сохраняю объект, свойство Version увеличивается в базе данных, как я и ожидал, но значение свойства объекта, похоже, иногда меняется.
using (var tx = session.BeginTransaction())
{
session.Merge(item);
tx.Commit();
item.Version; // Sometimes this is still 1, when I expect it to be 2.
}
Проблема заключается в том, что если он останется равным 1, и я внесу дополнительные изменения и сохраню их снова, я получу исключение StaleObjectStateException.
Что странно, так это то, что иногда он работает нормально, и значение item.Version корректно увеличивается, но я не могу понять разницу между случаями, когда это происходит, и случаями, когда это не так.
Я пытался найти, но не могу найти документацию по этому вопросу. Может кто-нибудь объяснить, как NHibernates ожидаемое поведение с отображением версии?
[NHibernate версия 2.1.2]
3 ответа
От ISession.Merge
документация:
Скопируйте состояние данного объекта на постоянный объект с тем же идентификатором. Если в данный момент нет постоянного экземпляра, связанного с сеансом, он будет загружен. Вернуть постоянный экземпляр. Если данный экземпляр не сохранен, сохраните копию и верните ее как новый постоянный экземпляр. Данный экземпляр не становится связанным с сеансом.
Таким образом, это не будет изменять item
,
(Могу добавить, что никогда не использовал Merge
в моих приложениях. Возможно, вы захотите проверить, как вы имеете дело с прикрепленными и отсоединенными объектами)
Вам необходимо очистить сессию, прежде чем обновленная версия распространится на ваши объекты. Если вы не завершите сеанс, вы несете ответственность за обновление сущностей самостоятельно.
Вы должны ТИПИЧНО позволить сеансу сбрасываться самостоятельно, когда он закрыт. Однако в некоторых случаях, когда вы полагаетесь на обновления базы данных, которые происходят через nhibernate, а не на настройки, которые вы устанавливаете для самого объекта, вам может потребоваться сбросить сеанс самостоятельно после принятия. В этом случае следует помнить, что при очистке сеанса будут зафиксированы ЛЮБЫЕ объекты, которые являются грязными. Это может быть нежелательно, поэтому убедитесь, что объем очень ограничен.