NHibernate не удаляет объекты из сеанса

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

Вот как я тестирую:

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

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

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

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


person RKitson    schedule 29.01.2009    source источник


Ответы (2)


Только что разобрался, оказалось, что это ошибка копирования и вставки. Хе, ПЕБКАК.

Я добавил 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));
person RKitson    schedule 29.01.2009

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

person Sean Carpenter    schedule 29.01.2009
comment
Спасибо за ответ, я ответил в редактировании вопроса. - person RKitson; 29.01.2009