2009-06-05 7 views
2

Cette question pourrait être un double de celui-ci:Comment désactiver le chargement automatique dans NHibernate?

nhibernate - disable automatic\lazy loading of child records for one to many relationsihps

Je voudrais savoir s'il y a une façon de dire NHibernate à ne pas charger une collection enfant (mieux si elle est avec Fluent NHibernate) à moins que je le fasse manuellement avec une requête (en gardant tous les mappings!).

Le problème est que même en désactivant le chargement paresseux, les collections sont automatiquement chargées. Je voudrais qu'aucune collection ne soit chargée sauf si je spécifie un fetchmode dans ma requête.

Répondre

1

Comme vous pouvez le voir à partir de la question et de la réponse que vous avez liées, vous pouvez y parvenir en rendant les relations unidirectionnelles. Donc, au lieu de répondre directement comment, je vais demander pourquoi dans l'espoir d'arriver à un meilleur "comment". Je vois clairement pourquoi vous ne voudriez pas toujours que les collections soient récupérées avec impatience, et c'est pourquoi NHibernate a un chargement paresseux (et pourquoi NHibernate charge toujours des collections paresseuses à moins que vous ne pré-fetch). NHibernate ne récupèrera pas cette collection jusqu'à ce que vous la demandiez. Donc, ma question est pourquoi voulez-vous que NHibernate ne charge pas la collection lorsque vous l'utilisez? Que voulez-vous que NHibernate fasse lorsque vous accédez à une collection enfant sur votre entité?

Mise à jour:

Vous ne l'avez pas vraiment répondu à ma question de savoir pourquoi (peut-être que je vais être têtu) mais bien, vous voulez un contrôle. Eh bien, le moyen le plus simple pour empêcher NH de faire son travail est de ne pas lui dire de le faire en premier lieu (c'est-à-dire ne pas le mapper). C'est-à-dire, ne mappez pas le "plusieurs" (collection) fin de la relation. Vous pouvez toujours conserver la collection sur votre classe mais tant que vous n'avez pas dit à NHibernate de la peupler en l'ajoutant à votre fichier de mapping, elle ne le sera jamais. Ensuite, vous pouvez ajouter une méthode PopulateCollection quelque part pour exécuter la requête NH et stocker les résultats dans cette collection. Vous perdez toute la belle sémantique que NHibernate fournit pour les collections, car il ne peut pas suivre les modifications; vous devrez implémenter vos propres méthodes d'ajout et de suppression. Donc, fondamentalement, la réponse de David Kemp sur l'autre question.

+1

la raison est simple, je veux contrôler manuellement ce qui est chargé et ce qui ne l'est pas. Je ne veux pas avoir des requêtes allant à la base de données sous le capot. En outre, il est très ennuyeux d'avoir des entités chargées paresseuses pendant que je débogue. Je m'attendrais à une exception nulle si je fonctionne sur une collection non chargée. – Drevak

Questions connexes