Nhibernate 如果您使用的是naitive标识,那么对象是否立即持久化?

Nhibernate 如果您使用的是naitive标识,那么对象是否立即持久化?,nhibernate,Nhibernate,在我的asp.net应用程序中,我在每个请求的开始/结束时打开和关闭/刷新会话 通过这种设置,我认为会产生如下结果: 实体e=EntityDao.GetById(1) e、 属性1=“诸如此类” EntityDao.MakePersistant(e) e=EntityDao.GetById(1) e、 Property1//这不是废话,它将是旧值,因为请求尚未刷新 但是我注意到返回的值是最近更新的值。 有人回答说是因为他们知道我的身份设置 有人能解释一下这种行为吗?因此,我不需要调用flush来

在我的asp.net应用程序中,我在每个请求的开始/结束时打开和关闭/刷新会话

通过这种设置,我认为会产生如下结果:

实体e=EntityDao.GetById(1)

e、 属性1=“诸如此类”

EntityDao.MakePersistant(e)

e=EntityDao.GetById(1)

e、 Property1//这不是废话,它将是旧值,因为请求尚未刷新

但是我注意到返回的值是最近更新的值。 有人回答说是因为他们知道我的身份设置

有人能解释一下这种行为吗?因此,我不需要调用flush来确保它被持久化到db?

我相信(但可能是错误的)nHibernate的缓存和更改跟踪是原因

由于此会话实例仍处于活动状态,nHibernate正在跟踪您对“e”所做的更改。当您再次请求时,它会在返回的对象中包含这些更改。当您调用MakePersistant(我假设它调用Session.SaveOrUpdate(e))时,它告诉会话实例您将保存这些更改,因此它知道这些更改,并且在您再次调用Session.Get(id)时仍将显示这些更改

如果您启动另一个会话,然后调用Session.Get(id),那么如果您没有调用Flush(或关闭事务,因为您应该在此处使用事务),您将看不到这些更改,因为它不知道在另一个会话中所做的更改

要回答您的另一个问题,您仍然需要调用Flush或关闭事务,以确保将更改写入数据库。有一点很好,那就是您实际上不需要调用SaveOrUpdate(e)。例如,此代码将导致数据库更新:

        using (var session = SessionFactory.OpenSession()) 
        using (var trans = session.BeginTransaction()){
            var e = session.Get(id);
            e.Name = "New Name";
            trans.Commit();
        }

nHibernate知道更新“e”,因为它正在跟踪在该会话期间对所做的更改。当我提交该事务时,它们被写入。注意,这是默认行为,如果需要,我相信可以更改。调用SaveOrUpdate()。

实际上查看sql profiler时,我看到db调用是在会话期间进行的,因此它会立即命中db,而不是从缓存中。MakePersistent()函数看起来像什么?它可能正在调用会话。然后刷新。