Объект не отсоединяется от сеанса nhibernate - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть приложение MVC, использующее nHibernate для сохранения данных, но по какой-то причине, несмотря на удаление моего объекта из сеанса, оно все еще сохраняется в базе данных.

У меня есть сложный объект, к которому я позволил пользователю применить изменение и сделать так, чтобы он пересчитывал дочерние коллекции на основе нового значения свойства родительского объекта. Но я не хочу, чтобы эти изменения сохранялись, потому что я передаю полученные изменения обратно в представление, чтобы сделать его только для предварительного просмотра. Пользователь может зафиксировать их, но используя другое действие.

Сразу же после того, как я запросил nHibernate для моего объекта в этом процессе, я исключил его из сеанса, но по какой-то причине он все еще сохраняется.

Согласно профайлеру nHibernate, это происходит из-за фиксации транзакции, которую я имею в фильтре, украшающем мое действие контроллера. Это было сделано из-за лучшей практики, которую я прочитал относительно элементов, считываемых из базы данных, которые не кэшируются в кэш 2-го уровня, если транзакция не зафиксирована, даже если не было внесено никаких изменений. Тем не менее, это не объясняет, почему фиксация привела бы к тому, что в удаленном объекте сохранялись изменения в базе данных. Я предполагаю, что упускаю что-то, что объясняет это поведение, но я не уверен, что?

1 Ответ

0 голосов
/ 10 ноября 2011

Прав ли я, что вы запрашиваете объект, затем исключаете его из сеанса и вносите изменения для предварительного просмотра пользователя?

Вы также меняете дочерние коллекции? Потому что, насколько я помню, при удалении объекта из NH он автоматически не выселяет связанные дочерние объекты (по крайней мере, в NH v2.x).

Таким образом, когда вы изменяете какой-либо дочерний объект (и вы явно не выселили его), он пытается сохранить его и из-за некоторых каскадных правил пытается также сохранить родительский объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...