NHibernate FlushMode, автоматический не сбрасывание прежде, находит

Хорошо, я видел, что некоторые сообщения спрашивают почти то же самое, но точки немного отличались.

Это - классический случай: я сохраняю/обновляю объект и, в рамках ТОЙ ЖЕ СЕССИИ, я пытаюсь получить их от базы данных (использующий критерии/находку/счетные/и т.д.) с 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

6
задан jfneis 20 July 2010 в 23:21
поделиться