为什么从Session中删除对象不会提交对数据库的更改?

Zub*_*ber 2 nhibernate

我在我的应用程序中使用NHibernate并具有以下情况.(请注意,为了便于理解,这里的情况要简化得多)

从数据库中查询对象.它使用编辑和更新Session.Update().然后Session.Evict(obj)在提交事务之前从会话(使用)中逐出该对象.预期的结果是更改将持久保存到数据库中.

当我将我的Id列作为NHibernate identity列时,这常常工作正常.最近,我们将Id列更改为非身份.因此,除非我Session.Flush()在Evict之前明确调用,否则上述方案不会持久存储到数据库中.

有人能指出/向我解释这种行为的原因吗?

这个链接,NHibernate Session.Flush&Evict vs Clear,提到了一些关于Evict和身份栏的内容,这对我来说不是很清楚.

Die*_*hon 9

您的工作流程不正确.

首先,当您从数据库中检索对象时,session.Update(entity)不执行任何操作.更改将自动发生Flush/Commit

接下来,Evict删除会话对该对象的所有知识,因此它不会保留对其应用的任何更改.在正常情况下,您几乎不应该使用此方法,这使我认为您没有正确处理会话.

第三,使用identity导致插入立即发生的事实Save是一个限制,而不是一个功能.

正确的工作流程是:

using (var session = factory.OpenSession())
using (var transaction = session.BeginTransaction())
{
    var entity = session.Get<EntityType>(id);
    entity.SomeProperty = newValue;
    transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)

精确的结构(using报表等),可以在桌面应用程序的变化,但其基本思想是一样的.