【问题标题】:NHIbernate & Rhino-Security does not save unless I call session.Flush()NHIbernate & Rhino-Security 不会保存,除非我调用 session.Flush()
【发布时间】:2010-08-26 00:13:01
【问题描述】:

我在使用 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);

我在某处缺少某些设置吗?

谢谢,

瑞克

【问题讨论】:

  • 我重新阅读了您的问题,并删除了我的答案,因为它没有解决您的具体问题。很抱歉!
  • 我还没有使用过 NHibernate,但是对于我使用过的其他 ORM 框架来说,这种行为听起来很合适——GetUsersGroupByName 大概是执行了一个 sql 调用并且尚未编写组(除非你执行 Flush) .除非 auth repo 保留自己的可用于满足读取请求的写入缓存(不仅仅是读取缓存),否则这似乎是设计使然。既然你提到了“各种博客中的例子”,介意分享这些吗?当然,我想了解有关 NHibernate 的更多信息,也许我可以在这里提供帮助:)
  • 我在帖子底部添加了一个链接和一个代码示例。

标签: c# nhibernate rhino-commons


【解决方案1】:

这是意料之中的,RS 使用与您的代码相同的会话,并且在内部调用 Flush 可能会导致意想不到的后果。 提交您的事务或调用 Flush

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2021-05-16
    • 2011-07-24
    相关资源
    最近更新 更多