困惑为什么我的实体变化反映了w / o提交?

时间:2009-12-18 22:17:29

标签: nhibernate

我正在使用nhiberate,存储库模式。

e.g。 MakePersistance看起来像:

 public T MakePersistent(T entity)
        {
            Session.Save(entity);

            return entity;
        }

在httpmodule中,开始请求:

ISession session = NHibernateHelper.OpenSession();
 session.BeginTransaction();

 CurrentSessionContext.Bind(session);

结束请求:

ISession session = CurrentSessionContext.Unbind(
            NHibernateHelper.SessionFactory);

            if (session != null)
                try
                {
                    session.Transaction.Commit();
                }
                catch (Exception ex)
                {
                    session.Transaction.Rollback();
                    //Server.Transfer("...", true);
                }
                finally
                {
                    session.Close();
                }

因此,在每个页面请求中,事务开始和结束。

根据我的理解,这意味着如果我更新实体,然后在更新后查询该实体,则查询将返回实体的原始状态,因为更新尚未提交到数据库。 / p>

但是,我测试(并在sql profiler中查看)db执行更新,然后检索同一个实体是新的/最新的。

所以我做了:

Entity e = EntityDao.GetById(1);

// e.count outputs 0

e.Count += 1;

// e.count outputs 1 as expected

EntityDao.MakePersistant(entity);

entity = EntityDao.GetById(1);  // getting from the db again

// e.count ouputs 1  ***

不应该是0但是因为db在请求结束并且提交到db?

之前是陈旧的

1 个答案:

答案 0 :(得分:1)

如果您的实体的主键是identy列,这是正常行为,因为NHibernate HAS将数据持久保存到数据库以获取实体的ID,以便将其置于其会话中。所有Post Insert Generators都是这种情况。 如果不希望这种情况发生并获得许多其他好处,您应该选择使用其中一个ORM样式生成器,如HiLo / Sequence HiLo生成器

有关详细信息,请查看此内容:

http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx