我对这段代码有疑问 如果我不使用该事务(我在该代码中注释),则不会发生更新。
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]
你是否有这种行为的含义?
此致
答案 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();
}