2010-08-26 44 views
2

我有一個問題,使用nHibernate和Rhino.Security。經過幾個小時的努力纔得到正確的配置設置,我終於得到了沒有任何錯誤的代碼運行。但是,除非我調用session.Flush(),否則不會將條目保存到數據庫。NHIbernate&Rhino-Security不保存,除非我打電話session.Flush()

查看網上的各種示例;我不應該調用flush。

這裏是我的配置代碼:

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); 

測試代碼:

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

的GetUsersGroupByName調用返回null。如果我在這兩個調用之間添加一個session.Flush調用,它會正常工作並返回該組。

根據各個博客的例子,如this one,我不應該調用flush。此外,包括在Rhino.Security代碼不做任何沖洗測試用例如下所示:

這是直出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); 

有一些設置我我在某處失蹤?

感謝,

裏克

+0

我已重新閱讀您的問題,並刪除了我的答案,因爲它沒有解決您的具體問題。對於那個很抱歉! – Sam 2010-08-26 04:36:59

+0

我還沒有使用過NHibernate,但是這個行爲聽起來對於我已經使用過的其他ORM框架是正確的--GetUsersGroupByName大概做了一個sql調用並且組沒有被寫入(除非你做了Flush)。 除非auth回購是保留自己的寫緩存(不只是讀取緩存),可用於履行讀取請求,這似乎是By Design。 既然你提到'各種博客中的例子',大家分享這些?我想了解更多關於NHibernate的信息,當然,也許我可以在這裏幫助啓動:) – 2010-08-26 04:58:47

+0

我在帖子底部添加了一個鏈接和一個代碼示例。 – rboarman 2010-08-26 15:04:40

回答

3

,預計,RS使用相同的會話你的代碼,並呼籲同花順內部可能會導致意想不到的後果。 承諾您的交易或致電Flush