Critères NHibernate avec charge parent distincte Tous les enfants?

J’ai une relation parent-enfant dans laquelle je souhaite renvoyer un seul parent et charger tous les enfants. J’utilise des critères parce que c’est une requête dynamic.

var messageQueueId = this.GetPropertyName(x => x.Id); var query = _sessionManager.Session.CreateCriteria(QUEUE_ALIAS); query.SetFirstResult(_pageOffset); query.SetMaxResults(_pageSize); query.Add(Ressortingctions.In(messageQueueId, _messageQueueIds)); query.List(); 

Cela renvoie le parent (MessageQueue) mais pas ses enfants (SearchMatches).

Quand j’essaie de faire ceci:

 var query = _sessionManager.Session .CreateCriteria(QUEUE_ALIAS) .CreateAlias(this.GetPropertyName(x => x.SearchMatches) , MATCH_ALIAS, JoinType.LeftOuterJoin); 

Ensuite, je charge les enfants, mais je reçois aussi des parents en double. Je comprends pourquoi cela se passe. Cependant, je ne comprends pas comment faire en sorte que le premier scénario charge simplement les correspondances de recherche automatiquement?

Voici mes entités:

 public class MessageQueue : EntityBase { ... public virtual IList SearchMatches { get; set; } ... } public class SearchMatch : EntityBase { ... public virtual MessageQueue MessageQueue { get; set; } ... } 

NHibernate Fluent est défini sur DefaultCascade.All() . Je n’ai pas d’autres substitutions pour ces objects.

J’ai essayé d’utiliser Inverse() et Not.LazyLoad() dehors de la substitution MessageQueue. Également essayé de charger Eager du CreateAlias. Mais je ne reçois toujours pas ce dont j’avais besoin.

Je suggère d’utiliser le paramètre batch-size="" . Il va finir dans
1) une requête émise par nous ( query.List(); ),
2) NHibernate utilisera ensuite une (ou quelques rares) requêtes pour charger la collecte pour chaque MessageQueue renvoyée.

19.1.5. Utilisation de la récupération par lots

NHibernate peut utiliser efficacement l’extraction par lots. En d’autres termes, NHibernate peut charger plusieurs proxies non initialisés si un proxy est utilisé (ou plusieurs collections). L’extraction par lots est une optimisation de la stratégie d’extraction sélective paresseuse. la classe et le niveau de collection.

L’extraction par lots pour les classes / entités est plus facile à comprendre. Imaginez que la situation suivante se présente au moment de l’exécution: vous avez 25 instances Cat chargées dans une ISession, chaque chat ayant une référence à son propriétaire, une personne. La classe Person est mappée avec un proxy, lazy = “true”. Si vous parcourez maintenant tous les chats et appelez cat.Owner sur chacun d’eux, NHibernate exécutera par défaut 25 instructions SELECT afin de récupérer les propriétaires mandatés. Vous pouvez régler ce problème en spécifiant une taille de lot dans le mappage de Person:

 ... 

L’alternative courante est (collection et niveau de classe)

 .BatchSize(25) 

Vérifiez également:

  • Comment implémenter la récupération par lots avec Fluent NHibernate lorsque vous travaillez avec Oracle?
  • Comment Eager Load Associations sans duplication dans NHibernate?
  • NHibernate QueryOver avec Fetch résultant de plusieurs requêtes SQL et hits de firebase database

Remarque: à la fin, le nombre passé en tant que taille de lot, par exemple 25, semble être utilisé comme moitié – 12. Ainsi, si vous effectuez une pagination sur une taille de 25, essayez d’utiliser SetBatchSize(50)