2010-08-26 3 views
2

J'ai un problème avec nHibernate et Rhino.Security. Après avoir lutté pendant des heures pour obtenir la bonne configuration de configuration, j'ai finalement obtenu le code pour fonctionner sans aucune erreur. Toutefois, aucune entrée n'est enregistrée dans la base de données à moins que j'appelle session.Flush().NHIbernate & Rhino-Security ne sauvegarde pas sauf si j'appelle session.Flush()

En regardant divers exemples sur le net; Je ne devrais pas avoir à appeler une couleur.

Voici mon code config:

var cfg = new Configuration() 
      .SetProperty(Environment.ConnectionDriver, typeof(SqlClientDriver).AssemblyQualifiedName) 
      .SetProperty(Environment.Dialect, typeof(MsSql2008Dialect).AssemblyQualifiedName) 
      .SetProperty(Environment.ConnectionString, "………") 
      .SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName) 
      .SetProperty(Environment.ReleaseConnections, "on_close") 
      .SetProperty(Environment.UseSecondLevelCache, "true") 
      .SetProperty(Environment.UseQueryCache, "true") 
      .SetProperty(Environment.CacheProvider, typeof(HashtableCacheProvider).AssemblyQualifiedName) 
      .AddAssembly("GA.CAP.Website") 
     ; 

     Security.Configure<AspNetUser>(cfg, SecurityTableStructure.Prefix); 

     var factory = cfg.BuildSessionFactory(); 

     var session = factory.OpenSession(); 


     var authorizationRepository = new AuthorizationRepository(session); 
     IoC.Container.RegisterInstance<IAuthorizationRepository>(authorizationRepository); 
     var permissionBuilderService = new PermissionsBuilderService(session, authorizationRepository); 
     IoC.Container.RegisterInstance<IPermissionsBuilderService>(permissionBuilderService); 
     var permissionService = new PermissionsService(authorizationRepository, session); 
     IoC.Container.RegisterInstance<IPermissionsService>(permissionService); 
     var authService = new AuthorizationService(permissionService, authorizationRepository); 
     IoC.Container.RegisterInstance<IAuthorizationService>(authService); 

Code d'essai:

authorizationRepository.CreateUsersGroup("GAAdmins"); 
    var group = authorizationRepository.GetUsersGroupByName("GAAdmins"); 

L'appel GetUsersGroupByName renvoie null. Si j'ajoute un appel session.Flush entre les deux appels, cela fonctionne très bien et renvoie le groupe. Basé sur des exemples dans divers blogs, tels que this one, je ne devrais pas avoir à appeler flush. De plus, les cas de test inclus dans le code Rhino.Security ne pas faire de rinçage comme indiqué ici:

Ceci est tout droit sorti de l'appareil de cas de test de Rhino.Security:

// on first deploy 
    Operation operation = authorizationRepository.CreateOperation("/Account/View"); 
    // when creating account 
    UsersGroup group = authorizationRepository.CreateUsersGroup("Belongs to " + account.Name); 

    // setting permission so only associated users can view 
    permissionsBuilderService 
     .Allow(operation) 
     .For(group) 
     .On(account) 
     .DefaultLevel() 
     .Save(); 

    // when adding user to account 
    authorizationRepository.AssociateUserWith(user, group); 

    bool allowed = authorizationService.IsAllowed(user, account, "/Account/View"); 
    Assert.True(allowed); 

est-il un paramètre I je manque quelque part?

Merci,

Rick

+0

J'ai relu votre question et supprimé ma réponse car elle ne répondait pas à votre problème spécifique. Désolé pour ça! – Sam

+0

Je n'ai pas encore utilisé NHibernate, mais le comportement semble correct pour les autres frameworks ORM que j'ai utilisés - le GetUsersGroupByName fait vraisemblablement un appel sql et le groupe n'a pas été écrit (sauf si vous faites le Flush). À moins que le référentiel d'authentification ne conserve son propre cache d'écriture (pas seulement le cache de lecture) pouvant être utilisé pour répondre aux demandes de lecture, cela semble être dû au fait qu'il s'agit d'un By Design. Puisque vous avez mentionné des «exemples dans divers blogs», de partager ceux-ci? Je voudrais en savoir plus sur NHibernate, bien sûr, et peut-être que je peux aider ici pour démarrer :) –

+0

J'ai ajouté un lien et un exemple de code au bas de mon message. – rboarman

Répondre

3

qui est prévu, RS utilise la même session que votre code, et appelant affleurant interne peuvent entraîner des conséquences non intentionnelles. Validez votre transaction ou appelez Flush

Questions connexes