2009-09-01 167 views
4

我遇到了NHibernate嘗試加載小數據層次結構的問題。我的域模型看起來像:急於在NHibernate中加載子對象和子對象集合

class GrandParent 
{ 
    int ID{get;set;} 
    IList<Parent> Parents {get; set;} 
} 

class Parent 
{ 
    IList<Child> Children {get; set;} 
} 

class Child 
{ 
} 

我想爲所給的GrandParent加載所有父母和孩子。這個Linq-to-NH查詢創建了正確的SQL並按預期加載了GrandParent:(該示例假定祖父母有兩個父母,每個父母有兩個子對象 - 總共有4個子對象)。

var linq = session.Linq<GrandParent>(); 
linq.Expand("Parents"); 
linq.Expand("Parents.Children"); 
linq.QueryOptions.RegisterCustomAction(c => 
    c.SetResultTransformer(new DistinctRootEntityResultTransformer())); 
var grandparent = (select g from session.Linq<GrandParent>() 
        where g.ID == 1 
        select g).ToList(); 

Assert(grandparent.Count == 1); //Works 
Assert(grandparent.Parents.Count == 2); //Fails - count = 4! 

grandparent.Parents集合包含4個項目,其中2個是重複的。看起來DistinctRootEntityResultTransformer只能在1級深的集合上工作,所以Parents集合會被複制,具體取決於每個父級擁有多少個Child對象。

是否有可能讓NH只包含不同的父對象?

非常感謝。

+0

你能解決這個問題嗎?這真的很煩人。 – 2010-03-28 10:10:29

+0

是的 - 請參閱以下有關更改IList for ICollection並在映射中使用「set」的評論。 – Simon 2010-03-31 12:15:59

回答

1

如果您的映射設置爲FetchType.Join,請嘗試將其更改爲FetchType.Select。

+0

感謝mxmissile,然後將工作,雖然你不能在Linq-to-NH中指定獲取類型(除非我失去了一些東西),並且這不是我想要一直使用的東西,所以我不願意修改映射。 另一個解決方法是將IList <>集合更改爲ICollection <>,並在映射中使用'set'而不是'bag'。我也一起駭入一個ResultTransformer來處理這個問題,並且一旦我達到了一個合理的標準,就會在這裏提供一個鏈接。 – Simon 2009-09-09 16:44:37

+0

@Simon,你可以在映射中指定默認的獲取類型 – zvolkov 2009-11-05 19:35:31

相關問題