0

我正在使用 Fluent NHibernate 映射 ProductCategory 树,一切正常,直到我尝试遍历从数据库返回的树以确保它正确保存和检索。

这是我的测试方式:

  1. 实例化 4 个类别:饮料、啤酒、淡啤酒和黑啤酒
  2. 将啤酒添加到饮料中,然后将淡啤酒和黑啤酒添加到啤酒中。
  3. 保存饮料(级联设置为 AllDeleteOrphan)
  4. 刷新会话,它会保留整个树
  5. 从会话中逐出每个 ProductCategories
  6. 从数据库加载饮料
  7. 检查加载的对象(fromDB)是 EqualTo 但不是 SameAs Beverages。
  8. 检查 fromDB 是否只有一个子 ProductCategory
  9. 检查 fromDB 中唯一的孩子是 EqualTo 但不是 SameAs Beer

测试失败,因为孩子是 SameAs 啤酒。这意味着它实际上并没有从数据库中加载对象,因为它仍在某个地方的 NHibernate 会话中。

任何见解将不胜感激。

编辑:回应肖恩的以下评论。我正在使用内存中的 SQLite 数据库,因此一旦会话/连接关闭,数据库就会被吹走。

4

2 回答 2

1

刚想通,原来这是一个复制和粘贴错误。嘿,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));
于 2009-01-29T03:58:02.573 回答
0

从测试的角度来看,您最好关闭用于创建对象的初始会话并创建一个新会话来检索对象。这将确保再次命中数据库以实例化对象(假设未启用二级缓存)。

于 2009-01-29T02:21:20.600 回答