Объект отключается от сеанса nHibernate после вызова TryUpdateModel - PullRequest
2 голосов
/ 22 июля 2010

Это работает:

public ActionResult Save(int id, string name)
{
    var profile = _profileRepository.GetById(id);
    profile.Name = name;
    _profileRepository.Save(profile); //this calls SaveOrUpdate()

    //session.Commit() gets called in global.asax on Application_EndRequest()
    //profile.Name is changed in the database
}

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

public ActionResult Save(int id)
{
    var profile = _profileRepository.GetById(id); 
    TryUpdateModel(profile); //this works from the looks of it
    _profileRepository.Save(profile); //this also appears to work;

    //fails on session.Commit()
    //nothing changed in database
}

«Другой» объект с тем же идентификаторомзначение??Похоже, что TryUpdateModel отключает объект моего профиля от сеанса.Есть мысли?

1 Ответ

2 голосов
/ 28 июля 2010

Первый пример будет работать, потому что вы обновляете тот же объект, полученный через сеанс NHibernate.

Во втором примере возможен сбой, поскольку TryUpdateModel () может заменить свойства вашего профиля (если существуют соответствующие данные ValueProvider). Если случайно вы отправляете данные обратно для одного из этих свойств, включая Id, метод TryUpdateModel () может заменить один из объектов, первоначально полученных через сеанс NHibernate. Когда вы попытаетесь сохранить профиль, NHibernate обнаружит, что вы не редактировали исходный объект, но пытаетесь сохранить другой объект с точно таким же идентификатором. Это приведет к исключению NonUniqueObjectException.

Чтобы решить эту проблему, вы должны убедиться, что обновляете значения исходных сущностей, извлеченных из сеанса. Я бы порекомендовал вам избегать использования DefaultModelBinder непосредственно для сущностей из вашего домена, для которых вы ожидаете, что будет выполнено отслеживание изменений.

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