【发布时间】:2009-06-16 11:17:37
【问题描述】:
我知道在 Hibernate/NHibernate 中避免 N+1 选择问题的基本方法,但是遇到了我找不到好的解决方案的问题的变体。
我映射了以下三个实体:Item、Category 和 Customer。项目与类别多对多关联,类别与客户多对一映射。到目前为止,没有什么特别的。
我的应用程序中的标准查询是获取给定客户的所有商品。我使用以下标准执行此操作,尝试急切地获取项目的类别,以避免在检查项目的类别属性时选择 N+1:
ICriteria criteria = mySession.CreateCriteria(typeof(Item));
.CreateCriteria("Categories", NHibernate.SqlCommand.JoinType.InnerJoin)
.Add(Expression.Eq("Customer", c));
criteria.SetFetchMode("Categories", FetchMode.Eager);
return criteria.List();
但是,这不起作用,NHibernate 稍后仍会使用每个项目一个选择来获取类别。
我认为 NHibernate 知道第一个查询的结果已被过滤(在客户上),并且查询返回的类别可能不完整,因此它稍后必须执行单独的查询获取类别。 (这个假设是否正确?在我看来,NHibernate 必须以这种方式工作以确保正确的结果似乎是合理的。)
但是,根据我的业务规则(或您要如何称呼它们),一个商品不能属于来自多个客户的类别,所以实际上我知道第一个查询的结果实际上是完整的。
我的问题是:我可以以任何方式告诉 NHibernate 这条业务规则吗?在这种情况下是否有另一种方法可以避免 N+1 选择(这似乎很常见)?
【问题讨论】: