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

本文关键字:对象 检索 更新 集合 nhibernate 问题 简单 | 更新日期: 2023-09-27 18:00:37

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

假设我有一个映射的Member对象,它持有一个指向Mail对象的1:n外键。我想在用户进入收件箱时为他检索当前的邮件集合。如果我调用memberInstance.Mail(类型为IList<''Mail>),它会带回邮件集合,但不会反映添加的新邮件,因为memberInstance在登录期间保存在缓存中,并且不会往返于数据库。如果我创建了一个RetrieveMailForUser方法,给它传递一个Member实例,然后调用Session.CreateCriteria<Mail>之类的代码。我会获得任何给定成员的当前邮件以及所有内容,但如果我从未使用过Member变量上的mail集合,以及在成员var中有一个不最新的集合,那么在它上有一个mail集合似乎是多余的。每次用户检查收件箱并将其保存到缓存时,我都可以刷新该成员,但这似乎有很多开销。我觉得我错过了nHibernate的一些基本原理。请帮忙。谢谢

调用成员的代码:

      public static Member GetLoggedInUser()
        {
             var member = (Member) HttpContext.Current.Session[SESSION_NAME];
            if(member != null && 
!NHibernateSessionManager.IsEntityAttachedToCurrentSession(member))
                NHibernateSessionManager.AttachEntityToSession(member);
            return member;

        }

E

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

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

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

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

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

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