我几乎可以肯定地说,问题不在于 NHibernate,而在于使用方面(我们都同意我的说法)
那么,我们应该(隐式或显式)作为起点的是惰性设置:
// class level
// by default lazy is turned on
<class name="Entity" ... lazy="true" ... >
...
// reference many-to-one level, also by default lazy
<many-to-one name="Entity" lazy="proxy" ... />
为了避免 N+1,我们应该确保使用带有 batch-size 设置的批量获取,see more here
// class/entity level
// ATTENTION - this is not implicit, we have to define that
<class name="Entity" ... lazy="true" ... batch-size="25" >
...
// collection level
// ATTENTION - this is not implicit, we have to define that
<bag name="Entities" ... batch-size="25">
...
有了它,现在 NHibernate 本身将永远不会加载超出需要的内容。那么,当需要加载参考时,典型的用例可能是什么?
覆盖时:
public override bool Equals(object obj)
{
}
public override int GetHashCode()
{
}
这些方法应该(有时 - 对于复合 ID,甚至必须)被覆盖,以提供业务唯一键。检查任何引用的值是否未用于此类比较(例如,对于某些 OtherEntity,Country 和 Office 的组合是唯一的)
最后但并非最不重要的,您的调试器可能存在问题。调试器实际上是在影响加载,因为每当我们在调试窗口中观察到任何东西时……我们都会强制 NHibernate 加载惰性的东西。
令人惊讶的是,这是“强制”加载的最常见来源。所以,清除你的观察者......
最后建议 - 创建 单元测试 以仅加载根实体。最后清除会话。观察(使用探查器)是否有一些 DB 命中。然后您可以更轻松地检查原因...