我有一些遗留代码,它们做了大量的惰性加载"静态"记录,并在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;
}
我认为最好在这里看看这个答案,https://stackoverflow.com/a/27164913/13945347,然后看看Ayende Rahien的这篇文章,以更好地理解N+1问题到底是什么,https://ayende.com/blog/3732/solving-the-select-n-1-problem。
我认为按你建议的方式处理你的问题不是最好的解决办法。您不应该使LazyLoad短路,并且应该在设计应用程序和模型时考虑到这一点。显式定义哪些模型应该被急切获取,哪些应该被惰性加载。