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.
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:
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)