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