关于nHibernate,我有一个非常简单的问题,但我无法在谷歌上找到答案。
假设我有一个映射的Member
对象,它包含Mail
个对象的1:n外键。我想在用户进入收件箱时检索当前的邮件集合。如果我调用memberInstance.Mail
(IList< \ Mail>类型),它会带回邮件收集,但不反映自登录期间memberInstance保存在缓存中而添加的新邮件,但不会往返数据库。如果我创建一个RetrieveMailForUser
方法,将其传递给一个成员实例,然后调用Session.CreateCriteria<Mail>
之类的代码。我获取任何给定成员的当前邮件以及所有内容,但在成员上有一个邮件集合似乎无关紧要变量,如果我从不使用它,以及在成员var中有一个不是最新的集合。每次用户检查他的收件箱并将其保存到缓存时,我都可以刷新该成员,但这似乎有很多开销。我觉得我缺少一些nHibernate的基本原理。请帮忙。谢谢!
调用该成员的代码:
public static Member GetLoggedInUser()
{
var member = (Member) HttpContext.Current.Session[SESSION_NAME];
if(member != null &&
!NHibernateSessionManager.IsEntityAttachedToCurrentSession(member))
NHibernateSessionManager.AttachEntityToSession(member);
return member;
}
电子
答案 0 :(得分:1)
从你的帖子中我得出两个相互矛盾的要求:
您希望缓存中有一个对象(成员),该对象不应根据数据库中的内容进行更新。缓存的本质不是自动重新加载任何东西或试图尝试这样做。
您希望每次访问时都会更新Member对象的Mails集合中的Mails(因此在第一次检索Member对象时忽略缓存中的内容)。
如果您想坚持第一种方法,只要为该对象创建新的Mail(调用member.AddMail(mail)或类似的东西),就必须直接更新缓存中的Member对象。我不知道这是否可行,因为你显然将会员留在会话中,这需要访问另一个会话的成员对象。
如果您还想要“最新”的邮件列表,我想无法明确重新加载您的邮件列表,重新加载整个对象,或者只是按照您上面建议的方式加载邮件(RetrieveMailForUser)。在这种情况下,您可以放心地删除Member对象中的Mails集合。如果您不需要它们,则不必映射集合。