Изменить дочерний объект во время Gridview OnUpdate, используя ObjectDataSource - PullRequest
0 голосов
/ 02 сентября 2010

Backgroud: Я использую NHibernate для своего модельного уровня, и у меня есть HTTP-модуль, который заботится о создании экземпляра сеанса в начале каждого запроса и очистке его в конце каждого запроса (т.е. сеанс на запрос).В этом случае у меня есть два типа объектов:

ParentItem - объект с набором свойств и коллекцией ChildItems.
ChildItem - объект со свойствами, включая DateTime (EffectiveDate) и необязательный FK, указывающий на совершенно другую базу данных.Класс ChildItem также содержит ссылку на родителя (много-к-одному)

Несмотря на то, что ParentItem имеет несколько ChildItems в своей коллекции, меня интересует только последняя версия ChildItem вcollection.

Желание: Требуется элемент управления с привязкой к данным (GridView или ListView, мне все равно, какой), который позволяет мне добавлять / редактировать / удалять ParentItems из моего источника данных.Я также хочу иметь возможность установить новый «последний» ChildItem как часть редактирования / обновления.

Проблема: Мне не удается получить доступ к базовому DataItem из GridView/ ListView в обработчике OnItemUpdating (что не является неожиданным, поскольку данные теперь находятся в состоянии просмотра).То, что я мог сделать, это загрузить ParentItem из моего сеанса, используя идентификатор из элемента управления с привязкой к данным, создать новый ChildItem, добавить его в ParentItem и затем сохранить ParentItem.Так как NHibernate кэширует данные, загрузка должна дать мне копию из кэша (без обратной передачи в БД), и я бы либо делал это до того, как ParentItem был сохранен обратно (таким образом, никаких изменений, зафиксированных в ParentItem, только в ChildItem), либо после(таким образом, кэшированная версия остается прежней, и мой новый объект будет соответствовать обновленной версии).Что я получаю, когда делаю это (для ParentItemID = 1):

a different object with the same identifier value was already associated 
with the session: 1, of entity: NameSpace.ParentItem

в строке:

Session.SaveOrUpdate(parentItemInstance);

Я предполагаю, что это связано с тем фактом, что мой ObjectDataSource загруженэтот ParentItem уже для того, чтобы обновить его, но я не уверен, куда идти отсюда.

1 Ответ

1 голос
/ 10 сентября 2010

Ваша проблема, вероятно, связана с сеансом.Вы создаете и закрываете сеанс NHibernate для каждого запроса?

Проблема в том, что «я думал, что мог бы сделать, это загрузить ParentItem из моего сеанса, используя идентификатор из элемента управления с привязкой к данным».Кажется, вы сохраняете объект, загруженный из одного сеанса, и сохраняете его в другом сеансе.

Вам следует использовать session.Merge, чтобы сохранить ваш объект из другого сеанса в текущий сеанс.Вы найдете отличную статью о разнице между session.SaveOrUpdate и session.Merge здесь: NHibernate - Разница между session.Merge и session.SaveOrUpdate?

...