NHibernate не выселяет объекты из сеанса - PullRequest
0 голосов
/ 29 января 2009

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 29 января 2009

Только что понял, оказалось, что это была ошибка копирования и вставки. Хех, PEBKAC.

Я добавил 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 голосов
/ 29 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...