2009-01-29 4 views
0

Я сопоставляю дерево ProductCategory с использованием Fluent NHibernate, и все шло хорошо, пока я не попытался пройти дерево, которое возвращается из базы данных, чтобы обеспечить его сохранение и последующее восстановление.NHibernate не вытесняет объекты из сеанса

Вот как я проверяю:

  1. Instantiate 4 категории: напитки, пиво, светлое пиво и темное пиво
  2. Добавить пиво в напитки, то светлое пиво и темное пиво с пивом.
  3. Сохранить напитки (каскад установлен в AllDeleteOrphan)
  4. Промойте сессии, которая сохраняется по всему дереву
  5. выселить каждый из ProductCategories от сессии
  6. нагрузки Напитков из базы данных
  7. Проверьте, что загруженный object (fromDB) является EqualTo, но не SameAs Beverages.
  8. Убедитесь, что fromDB имеет только один ребенок ProductCategory
  9. Убедитесь, что единственный ребенок в fromDB является EqualTo, но не SameAs Пиво

Тест терпит неудачу, потому что ребенок является SameAs пиво. Это означает, что на самом деле это не загрузка объекта из базы данных, поскольку он все еще находится в сеансе NHibernate.

Любое понимание будет оценено по достоинству.

Редактировать: В ответ на комментарии Шона ниже. Я использую базу данных SQLite в памяти, поэтому, как только сеанс/соединения закрыты, база данных сдувается.

ответ

1

Только что понял, получается, что это была копия & ошибка пасты. Хех, ПЕБКАК.

Я добавил 4 утверждения, убедитесь, что объекты находятся не в сессии:

Assert.That(Session.Contains(_beveragesCategory), Is.False); 
Assert.That(Session.Contains(_beerCategory), Is.False); 
Assert.That(Session.Contains(_darkBeerCategory), Is.False); 
Assert.That(Session.Contains(_lightBeerCategory), Is.False); 

Когда все те прошли (в первый раз я побежал их) я повнимательнее взглянуть на код, который утверждающая что объекты были разными и обнаружили, что утверждения были неправильными.

Был:

Assert.That(_beverageCategory.ChildCategories[0], Is.Not.SameAs(_beerCategory)); 

Должно быть:

Assert.That(fromDB.ChildCategories[0], Is.Not.SameAs(_beerCategory)); 
0

С точки зрения тестирования вам лучше закрыть начальный сеанс, который использовался для создания объектов и создания нового сеанса для извлечения объектов. Это заверит, что база данных снова ударяется, чтобы создать экземпляр объектов (при условии, что кеш 2-го уровня не включен).

+0

Спасибо за ответ, я ответил в правке вопроса. – RKitson

Смежные вопросы