2011-02-01 4 views
3

J'utilise le référentiel Rhino.Security pour gérer mes utilisateurs/rôles.
Le processus de création, de suppression et d'association fonctionne correctement, mais je suis confronté à un problème lorsque je lance une requête en utilisant une méthode: GetAssociatedUsersGroupFor.
La première fois que j'appelle la méthode, je n'obtiens aucun groupe pour mon utilisateur car je n'ai encore créé aucune association. À ce stade, j'associe un utilisateur à quelques groupes.
Je vérifie dans la base de données et je peux voir l'association.
Maintenant j'appelle à nouveau GetAssociatedUsersGroupFor mais je ne peux pas obtenir de groupes.
Avec le profiler j'ai vu que la base de données n'est pas impliquée cette fois. J'ai vérifié le code et j'ai trouvé que la fonction utilise un SetCacheable Nhibernate:Nhibernate et SetCacheable avec cache de second niveau

public virtual UsersGroup[] GetAssociatedUsersGroupFor(IUser user) 
    { 
     ICollection<UsersGroup> usersGroups = 
      SecurityCriterions.AllGroups(user) 
       .GetExecutableCriteria(session) 
       .AddOrder(Order.Asc("Name")) 
      .SetCacheable(true) 
      .List<UsersGroup>(); 
     return usersGroups.ToArray(); 
    } 

Depuis que je ne veux pas changer le code Rhino.Security, je voudrais savoir si je peux remplacer ou changez ce comportement de quelque façon que ce soit.

MISE À JOUR:

J'utilise cette instruction pour obtenir des groupes associés:

AuthorizationRepository.GetAssociatedUsersGroupFor(User); 

J'associe avec ce code:

AuthorizationRepository.AssociateUserWith(User, grpName); 

et détachez:

AuthorizationRepository.DetachUserFromGroup(User, groupToRemove.Name); 

MISE À JOUR

J'ai découvert que j'avais quitté le cache de second niveau dans ma config:

<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property> 
<property name="cache.use_second_level_cache">true</property> 
<property name="cache.use_query_cache">true</property> 

Je pensais que ce fut une bonne chose d'avoir un cache de niveau II, pour améliorer la la performance mais, il semble que je me trompais totalement.
Y a-t-il quelqu'un qui peut essayer de m'aider à comprendre ce qui se passe ici?

+0

Pouvez-vous poster votre code où vous sauvegardez les nouvelles associations et ensuite les récupérer? – nkirkes

+0

@mannish: J'ai joint le code. C'est très simple. Comme je l'ai dit, je peux trouver les enregistrements dans la base de données afin que tout fonctionne bien. J'ai recompilé le module Rhino.Security avec un commentaire ici: .SetCacheable (true) et tout fonctionne bien mais je voudrais éviter cela. – LeftyX

+0

Et juste pour que je sois clair, cela se passe dans des sessions NHib distinctes non? Vous ne faites pas tout cela en une seule session? Si les enregistrements se retrouvent dans la base de données, je suppose qu'il s'agit de différentes sessions/transactions. – nkirkes

Répondre

1

Il y a un problème avec rhino.security.
J'ai réussi à résoudre le problème, même si je ne l'aime pas.
J'ai appelé SessionFactory.EvictQueries() lorsque je change d'association et que tout fonctionne correctement.

Questions connexes