chi*_*oro 2 nhibernate session
我面临着其他人已经在SO上发布的相同问题:在从数据库中读取对象时,NHibernate将更新所有对象,因为DB中的一个字段的值不正确.
(详细说明:新添加的日期列在所有行中都包含"1/1/0001",因此在映射时,NHibernate将替换日期,并在tx.Commit()上更新每一行.)
[ 编辑:事实证明这是错误的.相反,这些日期字段为空,但NHibernate将更新为1/1/0001.有关详细信息,请参阅Diego的答案.]
为了防止这种情况,我发现这篇文章的答案是Ben Scheirman以及OP提到的博客评论.
评论者克里斯蒂安说:
您还可以通过使用session.setReadOnly(o,true)禁用Hibernate中的快照或使用query.setReadOnly(true)禁用所有查询对象来禁用自动脏检查和更新.
(请注意,这篇博文是关于Java Hibernate的.)
query.SetReadOnly(true)在我使用查询的地方成功了.但是,我也有这样的代码:
ISession session = this.NHibernateHelper.SessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();
try
{
BO resultBO = session.Get<BO>(id);
tx.Commit();
return resultBO;
}
catch (Exception ex)
{
tx.Rollback();
throw ex;
}
finally
{
session.Close();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我没有查询,并且Session.SetReadOnly(resultBO, true)NHibernate中不存在所述.它在哪里消失了?
我猜"逐出"基本上不是一个好主意,因为它使对象瞬态,所以我不能用它来更新另一个会话中的值(至少它变得更复杂.我还需要确保所有对象总是被驱逐所以我的通用更新方法不需要区分持久对象和瞬态对象 - 或者我完全错了?
谢谢和欢呼,chiccodoro
你正在攻击症状而不是疾病.
你有什么鬼(见http://jfromaniello.blogspot.com/2010/02/nhibernate-ghostbuster-version-11.html)
使该属性可以为空,你会没事的.
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |