【发布时间】:2010-07-20 23:21:34
【问题描述】:
好吧,我看到一些帖子问的问题几乎相同,但要点有点不同。
这是一个经典案例:我正在保存/更新一个实体,并且在 SAME SESSION 中,我试图从数据库中获取它们(使用条件/查找/可枚举/等) 与 FlushMode = Auto。问题是:NHibernate 在查询之前没有刷新更新,所以我从数据库中得到了不一致的数据。
“足够公平”,有些人会说,正如文档所述:
这个过程,flush,默认发生在以下几点:
- 来自 Find() 或 Enumerable() 的一些调用
- 来自 NHibernate.ITransaction.Commit()
- 来自 ISession.Flush()
粗体的“一些调用”清楚地表明 NH 完全没有责任。但是,IMO 在这里存在一致性问题,因为文档还指出:
除了显式 Flush() 之外,绝对不能保证 Session 何时执行 ADO.NET 调用,只能保证它们的执行顺序。但是,NHibernate 确实保证 ISession.Find(..) 方法永远不会返回过时的数据;他们也不会返回错误的数据。
因此,如果我使用 CreateQuery(查找替换)并过滤属性值为 20 的实体,NH 可能不返回值为 30 的实体,对吗?但事实上这就是发生的事情,因为 Flush 不会在它应该自动发生的时候自动发生。
public void FlushModeAutoTest()
{
ISession session = _sessionFactory.OpenSession();
session.FlushMode = FlushMode.Auto;
MappedEntity entity = new MappedEntity() { Name = "Entity", Value = 20 };
session.Save(entity);
entity.Value = 30;
session.SaveOrUpdate(entity);
// RETURNS ONE ENTITY, WHEN SHOULD RETURN ZERO
var list = session.CreateQuery("from MappedEntity where Value = 20").List<MappedEntity>();
session.Flush();
session.Close();
}
毕竟:我是不是弄错了,是一个错误还是只是一个不可预测的功能,所以每个人都必须调用 Flush 来确保它的工作?
谢谢。
菲利普
【问题讨论】:
标签: nhibernate