Как свойства обновления NHibernate должны отображаться как версия - PullRequest
3 голосов
/ 10 июня 2011

Использование беглого 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 корректно увеличивается, но я не могу понять разницу между случаями, когда это происходит, и случаями, когда это не так.

I 'Я пытался найти, но не могу найти документацию по этому вопросу.Кто-нибудь может объяснить, как NHibernates ожидает поведение с отображением версии?

[NHibernate версия 2.1.2]

Ответы [ 3 ]

2 голосов
/ 10 июня 2011

Из документации ISession.Merge:

Скопировать состояние данного объекта на постоянный объект с тем же идентификатором. Если в данный момент нет постоянного экземпляра, связанного с сеансом, он будет загружен. Вернуть постоянный экземпляр. Если данный экземпляр не сохранен, сохраните копию и верните ее как новый постоянный экземпляр. Данный экземпляр не становится связанным с сеансом.

Таким образом, он будет не изменять item.

(я мог бы добавить, что я никогда не использовал Merge в своих приложениях. Возможно, вы захотите проверить, как вы имеете дело с присоединенными и отсоединенными сущностями)

1 голос
/ 10 июня 2011

Вы пробовали

item = session.Merge(item);
tx.Commit();

?

0 голосов
/ 10 июня 2011

Вам необходимо очистить сеанс, прежде чем обновленная версия распространится на ваши объекты.Если вы не очистите сеанс, вы несете ответственность за своевременное обновление сущностей.

Вы должны ОБЯЗАТЕЛЬНО позволить сеансу сбрасываться самостоятельно, когда он закрывается.Однако в некоторых случаях, когда вы полагаетесь на обновления базы данных, которые происходят через nhibernate, а не на настройки, которые вы устанавливаете для самого объекта, вам может потребоваться сбросить сеанс самостоятельно после принятия.В этом случае имейте в виду, что при очистке сеанса будут зафиксированы ЛЮБЫЕ объекты, которые являются грязными.Это может быть нежелательно, поэтому убедитесь, что область действия очень ограничена.

...