我在我的应用程序中使用NHibernate并具有以下情况.(请注意,为了便于理解,这里的情况要简化得多)
从数据库中查询对象.它使用编辑和更新Session.Update().然后Session.Evict(obj)在提交事务之前从会话(使用)中逐出该对象.预期的结果是更改将持久保存到数据库中.
当我将我的Id列作为NHibernate identity列时,这常常工作正常.最近,我们将Id列更改为非身份.因此,除非我Session.Flush()在Evict之前明确调用,否则上述方案不会持久存储到数据库中.
有人能指出/向我解释这种行为的原因吗?
这个链接,NHibernate Session.Flush&Evict vs Clear,提到了一些关于Evict和身份栏的内容,这对我来说不是很清楚.
您的工作流程不正确.
首先,当您从数据库中检索对象时,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报表等),可以在桌面应用程序的变化,但其基本思想是一样的.
| 归档时间: |
|
| 查看次数: |
5356 次 |
| 最近记录: |