NHIbernate & Rhino-Security не сохраняет, пока я не вызову session.Flush () - PullRequest
2 голосов
/ 26 августа 2010

У меня проблема с использованием 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 возвращает ноль. Если я добавлю сеанс. Промежуточный вызов между двумя вызовами, он работает нормально и возвращает группу.

На основании примеров в различных блогах, таких как этот , мне не нужно вызывать 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);

Есть какие-то настройки, которые мне где-то не хватает?

Спасибо

Rick

1 Ответ

3 голосов
/ 26 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...