Хорошо, я видел, что некоторые сообщения спрашивают почти то же самое, но точки немного отличались.
Это - классический случай: я сохраняю/обновляю объект и, в рамках ТОЙ ЖЕ СЕССИИ, я пытаюсь получить их от базы данных (использующий критерии/находку/счетные/и т.д.) с FlushMode = Автоматический. Вопрос: NHibernate не сбрасывает обновления перед запросами, таким образом, я получаю непоследовательные данные из базы данных.
"Достаточно ярмарка", некоторые люди скажут, как документация указывает:
Этот процесс, сброс, происходит по умолчанию в следующих моментах:
- от некоторых вызовов Находки () или Счетный ()
- от NHibernate. ITransaction. Фиксация ()
- от ISession. Сброс ()
Полужирный "некоторые вызовы" ясно говорит, что NH не несет ответственности вообще. IMO, тем не менее, у нас есть проблема непротиворечивости здесь, потому что документ также указывает что:
Кроме тех случаев, когда Вы Сброс explicity (), нет абсолютно никаких гарантий о том, когда Сессия выполняет вызовы ADO.NET, только порядок, в котором они выполняются. Однако NHibernate действительно гарантирует что ISession. Найти (..) методы никогда не будут возвращать устаревшие данные; и при этом они не возвратят неправильные данные.
Так, если я использую CreateQuery (Найдите замену), и фильтрующий для объектов со значением свойства = 20, NH НЕ может возвратить объекты со Значением = 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();
}
В конце концов: я понимаю его превратно, действительно ли это - ошибка или просто не предсказуемая функция, таким образом, все должны назвать Сброс для уверения его работы?
Спасибо.
Filipe