2010-08-26 6 views
2

У меня возникла проблема с использованием nHibernate и Rhino.Security. После долгих часов, чтобы получить правильную настройку конфигурации, я, наконец, получил код для запуска без каких-либо ошибок. Тем не менее, никакие записи не сохраняются в базе данных, если я не вызову session.Flush().NHIbernate & Rhino-Security не сохраняется, если я не вызываю session.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 возвращает нуль. Если я добавлю session.Flush-вызов между двумя вызовами, он отлично работает и возвращает группу.

Основываясь на примерах в различных блогах, таких как this one, мне не нужно было бы называть флеш. Кроме того, тестовые примеры включены с кодом 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

+0

Я еще не использовал NHibernate, но поведение звучит правильно для других фреймворков ORM, которые я использовал, - предположительно, имя GetUsersGroupByName вызывает вызов и группа sql (если вы не выполняете Flush). Если автоответчик сохраняет свой собственный кэш записи (а не только кеш чтения), который может использоваться для выполнения запросов на чтение, это похоже на «По дизайну». Поскольку вы упомянули «примеры в разных блогах», разделить их? Я хотел бы узнать больше о NHibernate, конечно, и, может быть, я могу помочь здесь для загрузки :) –

+0

Я добавил ссылку и пример кода в нижней части сообщения. – rboarman

ответ

3

Это, как ожидается, RS использует тот же сеанс, как ваш код, и вызов Flush внутри может привести к непредвиденным последствиям. Завершите свою транзакцию или позвоните Flush