没有事务就无法更新对象

P. *_*ohm 4 nhibernate

我对这段代码有问题如果我不使用该事务(我在该代码中注释),则不会发生更新.

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

检索要更新的对象的代码:(请注意,登录不是唯一标识符)

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

当我启用调试模式时,我有这样的消息:

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]
Run Code Online (Sandbox Code Playgroud)

你是这种行为的意思吗?

问候

Fir*_*iro 6

NHibernate不会立即发送Update语句并将其缓存.在接下来的session.Flush()所有更新中一起发送以保存往返.transaction.Commit()将刷新所有对db的更改,否则db中的提交将不知道更新.

您甚至可以省略,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();
}
Run Code Online (Sandbox Code Playgroud)