代码之家  ›  专栏  ›  技术社区  ›  Grank

nHibernate未加载三级属性(不可刷新缓存)

  •  0
  • Grank  · 技术社区  · 16 年前

    我开始在一个基于Sharepoint的ASP.NET项目中切换一些预先存在的nHibernate代码,从每次数据库命中时的急于加载和新会话,切换到延迟加载和HTTP请求期间的会话,并开始遇到问题。

    当我们在这个系统中创建一个项目时,会有一些由下拉列表填充的多对一关系。这就得到了ID,它足以保存到数据库中。

    为了执行一些保存后任务(如电子邮件通知),我们将加载相同的项目,这将使我们填充整个对象树。

    然而,自从更改为延迟加载和整个请求的生存期内的会话以来,我们已经从项下神秘地为null的属性中获得了NullReferenceException。

    我们通过nHibernate将项目加载到changedItem中。失败的呼叫是:

    changedItem.PaperMedia.FormsAnalyst.User.Contact.Name
    

    PaperMedia已完全填充,但FormsAnalyst上的所有内容都为空,ID除外。

    这与我们保存它时的状态相同,因此此问题的一个可能原因是缓存并简单地检索该项,因此nHibernate不知道数据库中的实际值。但是,我正在提交事务,并在保存和后续加载之间的会话上显式调用Flush(),因此如果是这种情况,Commit()和Flush()都不会对缓存产生任何影响。

    我也在考虑最大深度。如果我在会话上调用Refresh(changedItem),它将不起作用。然而,如果我调用Refresh(changedItem.PaperMedia),它将一直填充到Name。这似乎不认为max_fetch_depth是问题所在,但我还是尝试增加它,在hibernate.cfg.xml中将它设置为6,并在创建会话工厂时在配置实例上设置SetProperty(“max_fetch_depth”,“6”),这些都没有效果。

    我不知道还能尝试什么。

    以前有人见过这样的吗?我是nHibernate的新手,所以可能很简单。。。

    编辑:

    现在的问题是,为什么Flush()不更新缓存项?这正是我所认为的。

    1 回复  |  直到 16 年前
        1
  •  0
  •   fwalch    16 年前

    我认为Flush()只用于向数据库发送更改。。。如果此时引用的对象在内存中,它将使用这些对象更新缓存。因此,您可以使用另一个会话或Clear()。。。或者首先填充FormsAnalyst。