2010-01-13 5 views
1

Mes objets de type Object1 contiennent la propriété List Children1. J'aimerais obtenir ces objets sans enfants.NHibernate: Comment récupérer un objet sans ses collections enfants?

On dirait detachedCriteria.SetFetchMode (« enfants1 », FetchMode.Lazy) devrait être la chose, mais apparemment ce n'est pas :( j'ai essayé d'obtenir les données à utiliser (nouveau SessionScope()) et la mise à null .Children1 mais il n'a pas réussi (les données déjà tiré par les cheveux).

Toutes les idées seraient appréciées.

+0

J'ai "résolu" le problème après quelques jours de poser la question, mais j'ai oublié d'écrire ici à ce sujet. Après avoir défini Lazy = true dans le mappage HasMany: 1) Quand je veux un comportement enthousiaste, je définis criteria.SetFetchMode ("Children1", FetchMode.Eager) 2) Quand je veux un comportement paresseux, je définis criteria.SetFetchMode ("Children1" , FetchMode.Lazy) et juste après, je FindAll (critères) mes objets, j'ai mis null à la propriété Children1 List. Je ne suis pas sûr que tous ces trucs sont nécessaires, mais je m'en fous. – wysek

Répondre

0

Lorsque vous associez la collection, êtes-vous de ne pas utiliser spécifiant le chargement paresseux? Essayez spécifiant lazy loading à ce point

+0

Je n'ai rien spécifié, donc les valeurs par défaut s'appliquent, mais je ne sais pas quelle est la valeur par défaut. BTW, le problème est "résolu". Je vais ajouter un commentaire dans quelques minutes. – wysek

0

Nous avons eu le même problème dans notre solution actuelle un d réglage Lazy dans la cartographie n'a pas fonctionné. Nous avons dû définir par défaut-paresseux à vrai et tout à coup cela a fonctionné.

Cela fonctionnerait mieux si toutes les relations devaient être paresseuses par défaut.

+0

Ok, j'ai mis Lazy = true sur l'attribut HasMany et maintenant ça marche, mais dans d'autres cas d'utilisation (plus fréquents) j'ai besoin de chargement impatient ... Je préférerais avoir un chargement avide par défaut et paresseux sur demande, mais si c'est trop compliqué ... Je vais essayer de réparer ces autres cas d'utilisation (maintenant j'obtiens LazyInitializationException ... impossible d'initialiser paresseusement une collection de rôle ... aucune session ou session n'a été fermée) – wysek

+0

Vous obtenez cette exception parce que votre session a été fermée, comme le dit le message. Vous devez injecter votre session dans votre classe repository/dataaccess et contrôler la durée de vie de la session depuis l'extérieur. Vous souhaitez que la session dure toute la durée de la requête, en particulier si vous avez un chargement paresseux. Nous utilisons un attribut UnitOfWork sur nos contrôleurs mvc pour initier et fermer une session, et si des exceptions nhibernate sont levées, il est traité et la session est annulée – Henning

0

Lorsque vous utilisez l'API ICriteria pour récupérer vos entités, vous pouvez spécifier (override) le fetchmode qui doit être utilisé pour les associations:

ICriteria crit = session.CreateCriteria (typeof(MyEntity)); 
crit.SetFetchMode ("someAssociationPath", FetchMode.Lazy); 
+0

J'ai essayé cela. Avez-vous réellement lu ma question? ;) BTW, le problème est "résolu". Je vais ajouter un commentaire dans quelques minutes. – wysek

0

Il me semble que vous utilisez biunivoque une cartographie. Dans ce cas, le chargement paresseux ne fonctionnera pas par conception. Si c'est le cas, veuillez cocher this article. Sinon, veuillez fournir un peu plus de code et de mappages.

+0

Pourquoi cela vous semble-t-il comme une correspondance biunivoque? quand Object1 a la liste Je pense qu'il est clair que c'est au moins un-à-plusieurs. BTW, le problème est "résolu". Je vais ajouter un commentaire dans quelques minutes. – wysek

+0

@wysek, vous n'avez fourni aucun code, donc j'ai juste supposé la raison la plus probable de mon point de vue.Désolé, je ne suis pas très à l'aise de lire. – zihotki

Questions connexes