【问题标题】:Simple question, retrieving an updated collection of nhibernate objects from the parent简单的问题,从父级检索更新的休眠对象集合
【发布时间】:2011-06-26 13:36:25
【问题描述】:

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

假设我有一个映射的Member 对象,该对象包含Mail 对象的1:n 外键。我想在用户进入收件箱时检索用户的当前邮件项目集合。如果我调用memberInstance.Mail(IList 类型),它会返回邮件集合,但不会反映添加的新邮件,因为 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;


        }

E

【问题讨论】:

  • 您提到对集合的更改不会反映在缓存项目中。我相信您的问题出在那儿-当您从缓存中重新获取该项目时,您对对象所做的更改应该得到反映。您能否提供一些有关您如何初始检索成员对象并将其持久化的更多信息?
  • 抱歉,它保存在 ASP 网络会话中而不是缓存中,我用检索用户的代码编辑了我的原始问题。

标签: c# asp.net nhibernate collections


【解决方案1】:

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

  1. 您希望缓存中的对象(成员)不应该根据数据库中发生的情况进行更新。缓存的本质是不会自动重新加载任何内容或尝试这样做。

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

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

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

【讨论】:

  • 我已将您的回复标记为答案,但我仍有几个问题。首先,我使用自动映射器来映射类,所以我认为我不能安全地把它取出来,你怎么看?其次,您如何显式重新加载邮件列表,是否有休眠功能或者我是否调用“RetrieveMailForUser”来重新填充它?感谢您的回答顺便说一句
  • 我不熟悉 automapper,但是您是否尝试过仅删除 Member 类中的 Mails 集合?对于重新加载,在您的情况下调用“RetrieveMailForUser”对我来说似乎很好。
猜你喜欢
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多