首页 > 解决方案 > NHibernate 短路延迟加载从缓存中拉取

问题描述

我有一些遗留代码可以对大量“静态”记录进行大量延迟加载,并在 NHibernate Profiler 中产生大量 N+1 警报,我正在尝试修复这些警报。我发现通过配置二级缓存,它修复了许多 N+1,但由于实体被它们的 ID以外的东西访问,许多实体仍然存在,即子实体上的外键值引用其父实体而不是子实体的主键。我的理解是,只有在实体通过 ID 访问时才使用二级缓存。我试图消除尽可能多的 N+1 问题,同时尽可能减少遗留代码中的代码更改。

有没有办法在 NHibernate 中缩短延迟加载,以便在调用 NHibernate 的延迟加载代码来执行数据库查询之前执行自定义代码?像下面这样的东西?

public class Customer
{
  public virtual IList<SomeStaticData> Foo
  {
    get
    {
      return CachedStuff.GetStaticData() ?? InvokeNHibernateLazyLoad();
    }

    set;
}

标签: nhibernatefluent-nhibernate

解决方案


我认为最好在这里查看这个答案,https: //stackoverflow.com/a/27164913/13945347 然后查看 Ayende Rahien 的这篇文章,以更好地了解 N+1 问题的真正含义,https://ayende.com/blog/3732/solving-the-select-n-1-problem

我认为解决您的问题的最佳方法不是按照您建议的方式处理它。您不应该使 LazyLoad 短路,并且应该考虑到这一点来设计您的应用程序和模型。明确定义哪些模型应该被急切地获取,哪些应该被延迟加载。


推荐阅读