NHibernate缓存麻烦

时间:2011-06-22 14:17:50

标签: c# .net nhibernate orm

我有两个具有一对多关系的实体,这些实体是用户和地址。一个用户可以拥有多个地址。我正在为每个HTTP请求模式使用一个会话和事务,并且启用了一级缓存。出于某种原因,我发现我的延迟加载集合没有处理对数据所做的更改。例如,如果我创建一个用户对象。然后我创建两个地址对象并保存它们像

User u1 = CreateNewUser("olduser@xyz.tld", "olduser@xyz.tld");
u1.Save();

Address a1 = CreateNewAddress(u1, "olduser@xyz.tld", "Old1", "User1");
a1.Save();
Address a2 = CreateNewAddress(u1, "olduser@xyz.tld", "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缓存设置配置中仍然缺少某些内容。任何帮助将不胜感激。

由于

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这里的默认事务类型是read committed,因此每次Save()后都需要Flush()或更改事务类型。