我想知道在什么情况下以下 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 已经更新,所以第二个选择查询应该成功。
观察生成的 SQL,似乎第二个选择查询的 SQL 在第一个 SaveOrUpdate 的 sql 之前执行。
事实上,如果我将整个方法包装在一个事务中,那么它就会成功:
using(NHibernateSessionManager.CurrentSession.BeginTransaction()
{
// Same code as above
}
现在 SaveOrUpdate 的 sql 将在 Linq.Where sql 之前执行。这有点奇怪,因为我什至不必在两者之间提交交易。
到底是怎么回事?