2009-01-29 19 views
0

我使用Fluent NHibernate来映射ProductCategory树,并且一切都很顺利,直到我试图走过从数据库返回的树以确保其正确保存和检索为止。NHibernate不会从会话中驱逐对象

这里是我如何测试:

  1. 实例化4类:饮料,啤酒,淡啤酒和黑啤酒
  2. 添加啤酒饮料,然后淡啤酒和黑啤酒到啤酒。
  3. 保存饮料(级联设置为AllDeleteOrphan)
  4. 刷新了会议,其中持续整个树
  5. 逐出每个会话中的ProductCategories从数据库
  6. 检查加载
  7. 负载饮料对象(fromDB)是EqualTo但不是SameAs Beverages。
  8. 检查fromDB只有一个子产品分类
  9. 检查中fromDB独生子女是EqualTo但因为孩子是sameAs的啤酒不sameAs的啤酒

测试失败。这意味着它实际上并没有从数据库中加载对象,因为它仍然处于NHibernate会话的某个地方。

任何见解将不胜感激。

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

回答

1

刚刚算出来,原来它是一个复制&粘贴错误。 Heh,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

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

+0

感谢您的回答,我在编辑的问题作出回应。 – RKitson 2009-01-29 02:34:43