没有事务就无法更新对象

时间:2011-11-16 13:17:29

标签: 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();
  }
}

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

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 个答案:

答案 0 :(得分:6)

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

您甚至可以省略session.Update(utilisateur);,因为会话会跟踪通过它加载的实体,并会在下一个Flush()将所有更改发送到db。

使用事务或调用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();
}