Question

Utilisation Château ActiveRecord, je suis tombé dans un problème lors de chargement paresseux.

Les travaux suivants (évidemment)

using (new SessionScope())
{
    User singleUser = User.FindFirst(...)
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

Depuis que je dois modifier les filtres de session dans un certain contexte (en utilisant des intercepteurs), créer un nouveau SessionScope.

using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

La dernière ligne « singleUser.Groups » jette un LazyInitializationException: « Impossible d'initialiser paresseusement une collection de rôle: les groupes, aucune session ou session fermée ».

Cependant, toutes les autres opérations de session fonctionnent correctement. Il semble donc que « mono-utilisateur » est lié à la SessionScope maintenant disposés. Pourquoi? Et comment cela peut-il être résolu encore?

Était-ce utile?

La solution

Mon GUESS est - une partie de la raison est de "Identity Map". Non seulement les objets chargés paresseux, mais aussi tous les objets sont liés à une session. Ceci assure pas deux objets représentent une seule ligne dans la base de données.

Autres conseils

Je crois que c'est la façon dont fonctionne NHibernate.

Vos entités sont toutes associées à une session et l'utiliser pour le chargement paresseux. Si vous disposez de votre session, vous ne pouvez pas récupérer les collections chargées paresseux et propriétés. La réponse, évidente compte tenu de cette limitation, est d'éviter l'élimination de la session -. Ou de garder la session en vie jusqu'à ce que vous avez extrait les données dont vous avez besoin

La portée intérieure ne diffère pas de l'extérieur; il ne supporte pas le chargement à l'extérieur de ce champ soit.

Vous pouvez toutefois contourner cette limitation, si vous duper NHibernate dans le chargement désireux de votre champ intérieur. Vous pouvez également appeler .ToList() ou similaire sur les collections que vous voulez travailler avec, avant de sortir du champ d'application et les données seront également disponibles à l'extérieur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top