次の 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 が更新されたことを認識するのに十分なほどスマートである必要があることを理解していたので、2 番目の選択クエリは成功するはずです。
生成された SQL を見ると、2 番目の選択クエリの SQL が最初の SaveOrUpdate の SQL の前に実行されているように見えます。
実際、メソッド全体をトランザクションでラップすると、成功します。
using(NHibernateSessionManager.CurrentSession.BeginTransaction()
{
// Same code as above
}
これで、SaveOrUpdate の sql が Linq.Where sql の前に実行されます。間にトランザクションをコミットする必要さえないので、これは少し奇妙です。
何が起こっている?