Мне интересно, при каких обстоятельствах может произойти сбой следующего кода 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 всегда не выполняется.
Если я вручную вызываю session.Flush после SaveOrUpdate, тогда запрос на выборку выполняется успешно, однако я подумал, что нам не нужно вручную вызывать flush? Насколько я понимаю, NHibernate должен быть достаточно умен, чтобы понять, что Foo обновлен, поэтому второй запрос на выборку должен быть успешным.
Наблюдая за сгенерированным SQL, кажется, что второй SQL-запрос на выбор выполняется перед первым sql SaveOrUpdate.
На самом деле, если я заверну весь метод в транзакции, он завершится успешно:
using(NHibernateSessionManager.CurrentSession.BeginTransaction()
{
// Same code as above
}
Теперь sql SaveOrUpdate будет выполняться до sql Linq.Where. Это немного странно, поскольку мне даже не нужно совершать транзакцию между ними.
Что происходит?