2010-12-07 26 views
8

J'utilise NH 3.0 et FNH 1.1 recompilé avec NH3.NHibernate: impossible de charger avec succès

J'ai un modèle d'utilisateur où je veux toujours récupérer son profil lors du chargement. J'utilise le fournisseur linq de NH3 mais je ne peux pas utiliser sa méthode Fetch (à cause de mon référentiel qui cache NHibernate et retourne un IQueryable et le fait que ToPagedList soit appelé sur la requête m'empêche donc de mettre Fetch comme dernier appel de la requête).

Dans le usermap je mis:

HasOne(x => x.Profile) 
    .Not.LazyLoad() 
    .Cascade.All(); 

Mais la mise en LazyLoad sur OFF ne vous aide pas. J'ai joué avec le mode fetch aussi. Mon attente est que si je définis ce mappage, je ne devrais même pas dire à Linq que je veux extraire le profil lorsque l'entité utilisateur est demandée. Linq devrait honorer la cartographie, non?

+1

hmmm ... Je pensais que 1-à-1 était toujours recherché ... en fait, je me souviens de ne pas être en mesure de charger paresseux un 1-à-1. Est-ce que cela a changé avec NH3? – dotjoe

+0

Ma référence est NH Profiler. Je vois 2 demandes, une sélection pour Utilisateur et une sélection pour Profil. Je dois admettre que je n'ai pas regardé ça quand j'utilisais NH2. –

Répondre

3

J'ai aussi ce problème, et malheureusement je pense que c'est par conception. Le fournisseur Linq NHibernate 3.0 utilise HQL sous les couvertures, et HQL n'honore pas vos mappings à cet égard. Par exemple, si vous avez

session.createQuery (« de profil »). Liste()

Vous ne gagnez une liste de tous les profils et votre classe d'utilisateur ne rejoindrait pas même si votre le mappage a outer-join = true.

Si vous utilisez l'ancien fournisseur NHibernate.Linq qui a utilisé l'API critera ou l'API Critères directement.

session.createCriteria() Liste()

vous obtiendrez Retourne une liste de tous les profils externes joints aux utilisateurs, comme votre fichier de mapping l'a demandé. Maintenant, je ne sais pas pourquoi le fournisseur linq soutenu par HQL n'honore pas vos mappages (et si quelqu'un connaît un moyen de contourner cela, s'il vous plaît postez), mais je crois que c'est la raison pour laquelle vous voyez ce comportement.