2009-09-01 13 views
4

NHibernate essaie de charger une petite hiérarchie de données. Mon modèle de domaine ressemble:Désireux de charger les collections enfant et enfant de l'enfant dans NHibernate

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

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

class Child 
{ 
} 

et je voudrais à la charge des parents désireux tous et les enfants pour un grand-parent donné. Cette requête Linq-to-NH crée le SQL correct et charge le GrandParent comme prévu: (l'exemple suppose que le grand-parent a 2 parents qui ont chacun 2 objets enfants - donc 4 objets enfants au total).

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! 

La collection grandparent.Parents contient 4 éléments, dont 2 sont des doublons. Il semble que DistinctRootEntityResultTransformer ne fonctionne que sur les collections de niveau 1, de sorte que la collection Parents est dupliquée en fonction du nombre d'objets enfants de chaque parent.

Est-il possible que NH n'inclue que les objets Parent distincts?

Merci beaucoup.

+0

Avez-vous pu résoudre ce problème? C'est vraiment énervant. –

+0

Oui - voir mon commentaire ci-dessous sur la modification de IList pour ICollection et l'utilisation de 'set' dans les mappages. – Simon

Répondre

1

Si votre mappage est défini sur FetchType.Join, essayez de le modifier en FetchType.Select.

+0

Merci mxmissile, alors ça marchera, même si vous ne pouvez pas spécifier le type de fetch dans Linq-to-NH (à moins que je ne manque quelque chose), et ce n'est pas quelque chose que je veux utiliser tout le temps mappages. Une autre solution consiste à remplacer les collections IList <> par ICollection <> et à utiliser 'set' au lieu de 'bag' dans le mappage. J'ai également piraté un ResultTransformer ensemble pour faire face à cela, et je vais fournir un lien ici une fois que je l'ai à un niveau raisonnable. – Simon

+0

@Simon, vous pouvez spécifier le type de récupération par défaut dans les mappages – zvolkov

Questions connexes