Хорошо, я видел несколько постов, в которых говорилось почти об одном и том же, но точки немного отличались.
Это классический случай: я сохраняю / обновляю сущность и, внутри ЖЕ СЕССИЯ , я пытаюсь получить их из базы данных (используя критерии / find / enumerable / etc) с FlushMode = Auto.Дело в том, что NHibernate не сбрасывает обновления перед запросом , поэтому я получаю противоречивые данные из базы данных.
«Достаточно справедливо», некоторые люди скажут, как документациясостояния:
Этот процесс, flush, происходит по умолчанию в следующих точках:
- из некоторые вызовы из Find () или Enumerable ()
- от NHibernate.ITransaction.Commit ()
- от ISession.Flush ()
Жирный «некоторые вызовы» ясно говорит, что NH не имеетответственность на всех.IMO, тем не менее, у нас есть проблема согласованности здесь, потому что документ также утверждает, что:
За исключением случаев, когда вы используете Explicity Flush (), нет абсолютно никаких гарантий относительно того, когда Session выполняет вызовы ADO.NET,только порядок, в котором они выполняются.Однако NHibernate действительно гарантирует, что методы ISession.Find (..) никогда не будут возвращать устаревшие данные;и при этом они не будут возвращать неправильные данные.
Итак, если я использую CreateQuery (Найти замену) и фильтрую для сущностей со свойством Value = 20, NH может NOT вернуть сущности со значением = 30, верно?Но именно это и происходит на самом деле, потому что сброс не происходит автоматически, когда это необходимо.
public void FlushModeAutoTest()
{
ISession session = _sessionFactory.OpenSession();
session.FlushMode = FlushMode.Auto;
MappedEntity entity = new MappedEntity() { Name = "Entity", Value = 20 };
session.Save(entity);
entity.Value = 30;
session.SaveOrUpdate(entity);
// RETURNS ONE ENTITY, WHEN SHOULD RETURN ZERO
var list = session.CreateQuery("from MappedEntity where Value = 20").List<MappedEntity>();
session.Flush();
session.Close();
}
В конце концов: я ошибаюсь, это ошибка или просто непредсказуемая функция, так что каждый долженпозвоните в Flush, чтобы убедиться в его работе?
Спасибо.
Filipe