【发布时间】:2010-11-29 23:04:07
【问题描述】:
我想知道在什么情况下下面的 NHibernate 代码会失败:
var session = NHibernateSessionManager.CurrentSession;
var foo = session.Linq<Foo>.ToList()[0];
foo.SomeProperty = "test";
session.SaveOrUpdate(foo);
var reloadedFoos = session.Linq<Foo>
.Where(x => x.SomeProperty == "test");
Assert.That(reloadedFoos.Count > 0);
Assert 语句总是失败。
如果我在SaveOrUpdate之后手动调用session.Flush,那么select查询成功,但是我认为我们不必手动调用flush?我的理解是 NHibernate 应该足够聪明地意识到 Foo 已经更新,所以第二个 select 查询应该会成功。
观察生成的 SQL,似乎第二个选择查询的 SQL 在第一个 SaveOrUpdate 的 sql 之前执行。
实际上,如果我将整个方法包装在一个事务中,那么它就成功了:
using(NHibernateSessionManager.CurrentSession.BeginTransaction()
{
// Same code as above
}
现在 SaveOrUpdate 的 sql 将在 Linq.Where sql 之前执行。这有点奇怪,因为我什至不必在两者之间提交事务。
发生了什么事?
【问题讨论】:
-
我认为您的问题具有误导性。我觉得您想了解 NHibernate 工作单元模式,关于与数据库同步更改。你介意澄清一下吗?
-
我真正想要的是让上述测试成功:我希望能够以可靠、简单的方式保存和重新加载 Foo。
标签: c# .net nhibernate flush