2009-09-01 2 views
4

NHibernateで小さな階層のデータをロードしようとすると問題が発生しました。私のドメインモデルは次のようになります。NHibernateで子と子のコレクションを読み込むのが好きです

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

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

class Child 
{ 
} 

と私は熱心な負荷を与え、祖父母のためのすべての親と子供をしたいと思います。このlinq-to-NHクエリは正しいSQLを作成し、期待通りにGrandParentをロードします(この例では、祖父母にそれぞれ2つの子オブジェクトがある2つの親があると仮定しています。

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コレクションには、2つのアイテムが重複しています。 DistinctRootEntityResultTransformerはコレクションのレベルが1レベルしかないので、各親が持つChildオブジェクトの数に応じてParentsコレクションが複製されるようです。

NHに個別のParentオブジェクトのみを含めることは可能ですか?

ありがとうございました。

+0

これを解決できましたか?それは本当に迷惑です。 –

+0

はい - ILolist for ICollectionを変更し、マッピングで 'set'を使用する方法については、下記のコメントを参照してください。 – Simon

答えて

1

マッピングがFetchType.Joinに設定されている場合は、FetchType.Selectに変更してみてください。

+0

ありがとうmxmissile、動作しますが、Linq-NHにフェッチタイプを指定することはできませんが(何か不足している場合を除きます)、常に使用したいものではありません。マッピング。 もう1つの修正は、IList <>コレクションをICollection <>に変更し、マッピングで 'bag'の代わりに 'set'を使用することです。また、これに対処するためにResultTransformerをハッキングしましたが、合理的な基準に達したらリンクを提供します。 – Simon

+0

@Simonでは、マッピングでデフォルトのフェッチタイプを指定できます – zvolkov

関連する問題