我正在使用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?
之前是陈旧的答案 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