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

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

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

Спасибо,

стог

1 ответ

Решение

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

Другие вопросы по тегам