6 votes

Interception du comportement de NHibernate Lazy-Load pour retourner null si non connecté à une session ?

Cela semble être une chose évidente, mais cela fait des heures que je cherche la réponse, sans succès.

J'utilise NHibernate pour faire persister un modèle de domaine, avec une couche de service qui sert un front-end ASP.NET MVC (la "couche de service" n'est actuellement qu'une bibliothèque de classes standard, mais elle pourrait être convertie en WCF à l'avenir). L'application Web demande les données qu'elle souhaite et spécifie les collections de l'objet de domaine dont elle a besoin, la couche de service prend la demande, charge l'objet et les collections requises (en utilisant le chargement paresseux) et renvoie l'objet où il est transformé à l'aide d'AutoMapper en une représentation conviviale du modèle de vue.

Ce que je veux pouvoir faire, c'est charger les collections requises, détacher l'objet de la session et le transmettre au front-end. Cependant, lorsque AutoMapper essaie de mapper l'objet, cela provoque une exception car il essaie d'accéder à des collections qui n'ont pas été initialisées et la session n'est plus disponible. Je peux laisser l'objet connecté, mais dans ce cas, la transformation d'AutoMapper finit par provoquer le chargement paresseux de toutes les propriétés de l'objet, ce qui ne sera pas une option si nous empruntons la voie WCF.

Ce que je veux faire, c'est modifier ce comportement de sorte qu'au lieu de lever une exception, la collection renvoie null (ou mieux encore, vide) lorsqu'elle n'est pas connectée à une session. C'était le comportement par défaut dans Entity Framework V1 (qui, il est vrai, ne faisait pas de chargement automatique paresseux), avec lequel j'ai travaillé précédemment, mais je ne trouve pas le moyen de le faire dans NH.

Des idées ? Suis-je sur la mauvaise piste ?

EDIT- Pour être un peu plus clair sur ce que j'essaie d'obtenir, lorsque j'accède à une propriété de collection, je veux ce comportement :

Connecté à la session : collection lazy-load comme normale.
Pas de session : la propriété est nulle (plutôt que de lancer une exception)

UPDATE - Suite ce poste par Billy McCafferty, j'ai réussi à mettre en œuvre une solution utilisant IUserCollectionType qui semble fonctionner jusqu'à présent. Plutôt que d'utiliser le PersistentGenericBag fourni comme il le fait, j'ai dû créer de nouveaux types qui changent le comportement lorsqu'ils ne sont pas connectés à la session. Ce n'est pas parfait et cela nécessite des mappings très vilains, mais au moins je n'ai pas besoin de toucher à mes objets de domaine ou aux mappings des clients pour que cela fonctionne.

2voto

Arunas Points 608

La solution la plus appropriée dans ce cas est probablement de vérifier dans AutoMapper les champs à chargement paresseux s'ils ont bien été chargés avec NHibernateUtil.IsInitialized(). Je ne suis pas sûr qu'il soit possible de faire en sorte qu'Automapper utilise cette vérification pour tous les mappages de propriétés implicites.

Vieille question mais voici ce que nous avons fait pour résoudre le même problème, en espérant que cela vous aidera à vous mettre sur la bonne voie si quelqu'un tombe sur ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X