2011-06-22 72 views
2

我有两个实体有一对多的关系,这些是用户和地址。一个用户可以有很多地址。我为每个HTTP请求模式使用一个会话和事务,并启用了1级缓存。出于某种原因,我看到我的懒加载的集合没有处理对数据所做的更改。例如,如果我创建一个用户对象。然后,我创建了两个地址对象,做断言我期待用户对象延迟加载两个地址时节省他们像NHibernate缓存故障

User u1 = CreateNewUser("[email protected]", "[email protected]"); 
u1.Save(); 

Address a1 = CreateNewAddress(u1, "[email protected]", "Old1", "User1"); 
a1.Save(); 
Address a2 = CreateNewAddress(u1, "[email protected]", "Old1", "User1"); 
a2.Save(); 
Session.Flush(); 
Assert.AreEqual(2, u1.Addresses.Count); // THIS IS FAILING BECAUSE COUNT IS 0 

现在和计数应该是2,但它返回0。如果我只是做扔掉完整缓存Session.Clear()调用也不起作用。但是,如果我通过执行Session.Clear()来抛弃完整缓存,然后以这种方式再次加载我的用户对象,它将按预期工作。我不知道我是否错过了一些东西,或者在NHibernate缓存设置配置中还是缺少一些东西。任何帮助将不胜感激。

感谢

回答

0

您必须将地址添加到用户类太...通常会看到人民创造的方法u1.AddAddress(A1);它将在地址对象上设置对用户的引用并将其添加到用户的地址列表中。

+0

嗯,我是新来的NHibernate但我认为这是假设由NHibernate的工作要做。我认为在同一个会话中,NHibernate会跟踪所有更改并通知相关的项目。情况并非如此。 – Leadfoot

+0

呃...我假设你的User类有一个地址列表。如果您希望Count()为2,那么您需要添加到该列表中.NH不会为您执行此操作,除非您再次从DB重新加载对象。 – Todd

0

这里的默认事务类型是读取提交的,因此您需要在每个Save()后更改Flush()或更改事务类型。

1

您应该将地址添加到用户对象或刷新用户对象(从数据库中重新加载):

Session.Flush(); 
Session.Refresh(u1); 
Assert.AreEqual(2, u1.Addresses.Count);