Нужно ли мне загружать / получать объект перед SaveOrUpdate в Nhibernate?

в моем приложении ASP.NET MVC. Я отделил модель предметной области от модели представления.
Я преобразовываю свою сущность в объект модели представления, чтобы я мог "кормить" свои представления только необходимыми данными (для этой цели я использовал valueinjecter).
Во время процесса сохранения мой контроллер возвращает объект модели представления, преобразует его в объект модели предметной области и пытается сохранить его с помощью SaveOrUpdate. Я заметил, что если я пытаюсь обновить существующую запись, Nhibernate рассматривает ее как новый объект и принудительно выполняет INSERT, даже если у моей сущности есть правильный идентификатор.
Я не загружал (Get / Load) объект раньше, потому что я бы не хотел повторно отображать все поля.
Что я делаю не так? Как лучше всего этого добиться?

***** - ОБНОВЛЕНИЕ - ***

Мой контроллер получает пользователя (ViewModel), проверяет его и пытается сохранить через уровень сервиса как объект:

public ActionResult Edit(Guid id, Models.User User)
{
...
var user = new Domain.User();
user.InjectFrom(User);
user.SetId(id);

user = this._SecurityService.SaveUser(user);

}

Это служба:

public Domain.User SaveUser(Domain.User User)
        {
            bool Result = false;

            if (this._ValidationEngine.IsValid(User))
            {
                using (_UnitOfWork)
                {
                    if (User.Code != Guid.Empty)
                    {
                        var user = this._UserRepository.Load(User.Code);
                        user.InjectFrom(User);
                        User = this._UserRepository.Update(user);
                    }
                    else {
                        User = this._UserRepository.Save(User);
                    }
                    Result = _UnitOfWork.Commit();
                }
            }
            return (User);
        }

Меня беспокоит тот факт, что мне приходится столько раз преобразовывать свою модель представления / сущность. Теперь, когда я пытаюсь сохранить нового пользователя, я получаю следующее сообщение: Строка была обновлена ​​или удалена другой транзакцией (или отображение несохраненных значений было неверным)
Вероятно, это каким-то образом связано с тем, что мне говорил Дарин .
Есть ли лучший способ сделать то, что я пытаюсь сделать?

ОБНОВЛЕНИЕ

Я заметил, что ошибка «Строка была обновлена ​​или удалена ...» вызвана тем, что У меня есть версия, определенная для моих сопоставлений. Я могу понять, что мне нужен Id и версия , соответствующие сущности, которую я хочу обновить.
Я хотел бы понять, как другие люди делают это с помощью DDD + ASP.NET MVC + NHibernate ???

РЕШЕНИЕ

Все мои сущности имеют определенную версию (я забыл сказать, извините):


   

Как Айенде объяснил здесь , Nhibernate пытается обновить мою сущность с помощью такого запроса:

UPDATE Table SET field1 = 'bla', Version = (y+1) WHERE id = x AND Version = y

где y должна быть версией моей сущности. Поскольку я не заполнял свою сущность версией, она генерировала исключение StaleObjectException.
Я добавил поле версии в свою модель просмотра. Я сохраняю его в скрытом поле своего обзора вместе с идентификатором.
Теперь мой контроллер получает модель просмотра с идентификатором и версией. Я вставляю эти поля в свой объект домена и позволяю репозиторию сохранить его (я не перезагружаю свой объект):

User = this._UserRepository.Update(user);

Если я получаю исключение StaleObjectException , это означает, что кто-то еще обновил строку БД и Я дам пользователю отзыв.

7
задан LeftyX 27 January 2011 в 16:37
поделиться