我想知道以下 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 之前执行。这有点奇怪,因为我什至不必在两者之间提交事务。
这是怎么回事?
最佳答案
我建议您利用 NHibernate 事务。如果不使用它们,NHibernate 完全有可能无法确定何时发出您的 SaveOrUpdate 调用。
您会发现即使是只读语句在使用事务时也能表现得更好。请看http://nhprof.com/Learn/Alert?name=DoNotUseImplicitTransactions了解更多详情。
例如:
using(var session = NHibernateSessionManager.CurrentSession)
{
using(var transaction = session.BeginTransaction())
{
var foo = session.Linq<Foo>.ToList()[0];
foo.SomeProperty = "test";
session.SaveOrUpdate(foo);
transaction.Commit();
}
}
关于c# - NHibernate 没有获取更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1452439/