我知道避免Hibernate/NHibernate中N + 1選擇問題的基本方法,但遇到了一個問題的變體,我無法找到一個好的解決方案。避免N + 1選擇在NHibernate中使用業務規則
我有以下三個實體映射:項目,類別和客戶。一個項目與多個類別關聯到一個類別,並且一個類別被多對一地映射到客戶。迄今爲止,沒有什麼特別的
我的應用程序中的標準查詢是獲取給定客戶的所有項目。我該使用下列標準,試圖獲取項目熱切的類別,以避免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知道第一個查詢的結果被過濾(在Customer上),並且查詢返回的類別可能不完整,因此它稍後必須執行單獨的查詢獲取類別。 (這個假設是否正確?我認爲NHibernate必須以這種方式來確保正確的結果。)
但是,根據我的業務規則(或者你想要稱之爲什麼),一個項目不能屬於來自多個客戶的類別,所以實際上我知道第一個查詢的結果實際上是完整的。
我的問題是:我可以告訴NHibernate有關此業務規則的任何方式嗎?有沒有另外一種方法可以避免N + 1在這種情況下的選擇(這看起來很常見)?