NHibernate & Отмена изменений в сущностях - PullRequest
5 голосов
/ 30 марта 2010

Кажется, это обычная проблема, но я не знаю, как лучше ее решить.Я хочу иметь возможность отправлять объект в представление, вносить изменения в объект в представлении, но затем отменять (удалять) эти изменения, если пользователь отменяет представление.Как правильно это сделать.

Вот два варианта, которые у меня есть, но я думаю, что должны быть другие, которые лучше

1) Возьмите сущность, создайте клон, отправьте клонв представление ... если изменения приняты, обновите исходную сущность со значениями клона

2) Отправьте сущность в представление, если пользователь отменяет, удалите сущность из кэша NHibernate и перезагрузите ее избаза данных

Для (2) проблема для меня заключается в том, что на старую сущность все еще можно ссылаться в моем проекте после ее удаления из кэша.

Редактировать:

Хорошо, так что метод evict - это путь, если я реализую метод (2).Спасибо, я не мог вспомнить детали этого.Тем не менее, проблема просмотра объектов, ссылающихся на мои старые выселенные сущности, усложняет проблему.Я не могу просто сделать так, чтобы мое представление автоматически обновлялось до новой сущности, не имея собственного кода в каждом из них, который можно было бы перепривязать, когда поднялось мое собственное событие выселения.И переплетение не может быть тривиальным в некоторых случаях.Мне нужно подумать об этом еще немного, поскольку я могу быть слишком сложным, но в данный момент этот метод кажется более хитрым.

Я подозреваю, что я застряну с методом (1), который имеет свой собственный набор проблемно подожду немного дольше, чтобы узнать, есть ли у кого-нибудь еще идеи.

Редактировать 2 : Только что нашел это.Я думаю, что он в значительной степени охватывает ответ подробно и поставляется с отличным демонстрационным проектом - Создание настольного приложения To-Do с помощью NHibernate - http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

В дополнение к этому, NHibernate имеетфункция Session.Refresh (Object entity) , которая, кажется, решает точную проблему.Поэтому, когда объект изменяется, но затем отменяется перед сохранением, я могу просто вызвать Session.Refresh, чтобы перезагрузить его из базы данных и отменить изменения.

Ответы [ 2 ]

1 голос
/ 30 марта 2010

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

Использование ViewModels становится предпочтительным способом работы в ASP.net MVC и Silverlight / WPF.

Чтобы узнать больше о Viewmodels: http://blogs.msdn.com/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

1 голос
/ 30 марта 2010

Лучший способ сделать это - вызвать метод Evict для ISession, используемого для загрузки объекта. Это удалит объект из кэша сеанса. и затем вы можете перезагрузить и снова отобразить его.

Исключение объекта из сеанса делает его временным отсоединенным, поэтому, если в проекте все еще есть ссылки на него, они не будут сохраняться при сбросе сеанса. То, как вы справляетесь с этим, зависит от вашего приложения, но я бы посоветовал поднять событие, чтобы уведомить подписчиков о том, что им нужно перезагрузить объект.

...