NHibernate不会从会话中驱逐对象

时间:2009-01-29 00:25:08

标签: nhibernate session fluent-nhibernate

我正在使用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
  10. 测试失败,因为孩子是SameAs啤酒。这意味着它实际上并没有从数据库加载对象,因为它仍然在某个地方的NHibernate会话中。

    非常感谢任何见解。

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

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

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