Не удается обновить объект без транзакции - PullRequest
4 голосов
/ 16 ноября 2011

У меня проблема с этим фрагментом кода Если я не использую транзакцию (я прокомментировал здесь этот код), обновление не произойдет.

using (var session = Repository.TSession())
{
  var utilisateurDal = new UtilisateurDal(session);
  var utilisateur = utilisateurDal.GetUtilisateur(login);
  if (utilisateur != null)
  {
    //var transaction = Session.BeginTransaction();
    utilisateur.MotDePasse = "test";
    session.Update(utilisateur);
    //transaction.Commit();
  }
}

Код, который извлекает объект для обновления: (Обратите внимание, что логин не является уникальным идентификатором)

public Utilisateur GetUtilisateur(ISession session, string login)
{
  return session.Query<Utilisateur>().SingleOrDefault(u => u.Identifiant == login);
}

Когда я включаю режим отладки, у меня появляется это сообщение:

NHibernate.Event.Default.DefaultSaveOrUpdateEventListener: 2011-11-16 14:14:57,832 [35] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] - ignoring persistent instance
NHibernate.Event.Default.DefaultSaveOrUpdateEventListener: 2011-11-16 14:14:57,833 [35]     DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener [(null)] - object already associated with session: [BusinessObjets.Utilisateur#3]

Вы понимаете смысл этого поведения?

Привет

1 Ответ

6 голосов
/ 16 ноября 2011

NHibernate не отправляет оператор Update немедленно и кэширует его. На следующий session.Flush() все обновления отправляются вместе, чтобы сохранить туда и обратно. transaction.Commit() Сбросит все изменения в БД, в противном случае коммит в БД не будет знать об обновлениях.

вы даже можете опустить session.Update(utilisateur);, потому что сеанс отслеживает объекты, загруженные через него, и отправит все изменения в db на следующем Flush().

Либо используйте транзакцию, либо вызовите session.Flush (); в конце ваших обновлений.

это может выглядеть так

using (var session = Repository.TSession())
using (var transaction = Session.BeginTransaction())
{
    var utilisateurDal = new UtilisateurDal(session);
    var utilisateur = utilisateurDal.GetUtilisateur(login);
    if (utilisateur != null)
    {
        utilisateur.MotDePasse = "test";
    }
    transaction.Commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...