我想知道以下NHibernate代码在什么情况下可能会失败:
Assert语句总是失败。
如果我在SaveOrUpdate之后手动调用session.Flush,那么选择查询会成功,但我认为我们不必手动调用flush?我的理解是NHibernate应该足够聪明,意识到Foo已经更新,因此第二个选择查询应该成功。
观察生成的SQL,似乎第二个选择查询的SQL在第一个SaveOrUpdate的SQL之前执行。
事实上,如果我将整个方法包装在一个事务中,那么它就成功了:
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,那么选择查询会成功,但我认为我们不必手动调用flush?我的理解是NHibernate应该足够聪明,意识到Foo已经更新,因此第二个选择查询应该成功。
观察生成的SQL,似乎第二个选择查询的SQL在第一个SaveOrUpdate的SQL之前执行。
事实上,如果我将整个方法包装在一个事务中,那么它就成功了:
using(NHibernateSessionManager.CurrentSession.BeginTransaction()
{
// Same code as above
}
现在SaveOrUpdate的SQL语句会在Linq.Where之前执行。这有点奇怪,因为我甚至不需要在两者之间提交事务。
到底发生了什么?