2010-08-06 6 views
2

J'ai plusieurs entités configurées via FNH pour charger les entités enfants avec la syntaxe FetchMode.Eager lorsque je demande des instances (à partir de la base de données). Maintenant, j'étais sous l'impression que cela ignorerait tout chargement paresseux dans la cartographie et peuplerait les entités enfants avec les données 'réelles'.(Fluent) Nhibernate charge paresseux et affecte sur Parallel.ForEach

La raison pour laquelle je veux faire est parce que je veux utiliser un Parallel.ForEach itérer sur une collection d'entités et de générer un ensemble de résultats, mais je reçois l'erreur suivante:

[18000] System.InvalidOperationException: 
There is already an open DataReader associated with this Command 
which must be closed first. 

Si je utilisez 'NHibernateUtil.Initialize' pour initialiser toutes les entités enfants, puis cela fonctionne comme prévu.

Est-ce que je me trompe dans l'utilisation de FetchMode.Eager?

Répondre

1

Je ne voudrais vraiment pas essayer de le faire. Chaque fonction Parallel.ForEach peut s'exécuter sur un thread différent. Selon votre configuration, le NHibernate ISession est stocké sur un thread signifiant autre chose que le thread appelant ne peut pas accéder à la session, c'est pourquoi tout échoue.

Personnellement, je récupèrerais le tout dans un objet de transfert, puis je ferais le Parallel.ForEach sur cela.

+0

Je sais tout cela, d'où l'utilisation de 'NHibernateUtil.Initialize' – AwkwardCoder

+0

Peu importe. Vos objets ont toujours des proxies autour d'eux qui s'attendent à ce que le contexte soit présent, ce qui n'est pas le cas si vous êtes sur un thread différent. – Deleted

+0

NHibernateUtil.Initialize supprime les proxies .... – AwkwardCoder