简单的问题,从父级检索更新的nhibernate对象集合

时间:2011-06-26 13:36:25

标签: c# asp.net nhibernate collections

关于nHibernate,我有一个非常简单的问题,但我无法在谷歌上找到答案。

假设我有一个映射的Member对象,它包含Mail个对象的1:n外键。我想在用户进入收件箱时检索当前的邮件集合。如果我调用memberInstance.Mail(IList&lt; \ Mail&gt;类型),它会带回邮件收集,但不反映自登录期间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;


        }

电子

1 个答案:

答案 0 :(得分:1)

从你的帖子中我得出两个相互矛盾的要求:

  1. 您希望缓存中有一个对象(成员),该对象不应根据数据库中的内容进行更新。缓存的本质不是自动重新加载任何东西或试图尝试这样做。

  2. 您希望每次访问时都会更新Member对象的Mails集合中的Mails(因此在第一次检索Member对象时忽略缓存中的内容)。

  3. 如果您想坚持第一种方法,只要为该对象创建新的Mail(调用member.AddMail(mail)或类似的东西),就必须直接更新缓存中的Member对象。我不知道这是否可行,因为你显然将会员留在会话中,这需要访问另一个会话的成员对象。

    如果您还想要“最新”的邮件列表,我想无法明确重新加载您的邮件列表,重新加载整个对象,或者只是按照您上面建议的方式加载邮件(RetrieveMailForUser)。在这种情况下,您可以放心地删除Member对象中的Mails集合。如果您不需要它们,则不必映射集合。