NHibernate中的只读连接集合

时间:2010-08-16 17:10:22

标签: nhibernate fluent-nhibernate

这是基本情况。在我们的应用程序中,我们有角色和权限。角色和权限之间存在多对多关系。问题在于,可以直接为用户分配角色,或者他们可以通过支付服务来获得他们获得的角色。为了使事情变得更有趣,如果用户取消付费服务,或者它已过期,那么他们就不再具有该角色。我的问题是我想在任何给定用户上拥有有效权限的(只读)集合,我希望能够对其进行查询。一些映射细节:

    public ApplicationPermissionMap()
    {
        Table("CLSYS_ApplicationPermissions");

        Id(ap => ap.ID)
            .Column("ApplicationPermissionID")
            .GeneratedBy.Assigned();

        //...
    }

    public ApplicationRoleMap()
    {
        Table("CLSYS_ApplicationRole");

        Id(role => role.ID)
            .Column("ApplicationRoleID");           

        HasManyToMany(r => r.Permissions)
            .Table("CLSYS_ApplicationRolePermissions")
            .ParentKeyColumn("ApplicationRoleID")
            .ChildKeyColumn("PermissionID")
            .Cascade.None();

        //...
    }

    public PaidServiceMap()
    {

        Table("ECOM_PaidService");

        Id(ps => ps.ID)
            .Column("PaidServiceID");

        Component(ps => ps.Status, statusMapping =>
        {
            statusMapping.Map(status => status.ID)
                .Column("StatusID")
                .Not.Nullable();

        });

        HasManyToMany(ps => ps.ApplicationRoles)
            .Table("ECOM_PaidServiceRoles")
            .ParentKeyColumn("PaidServiceID")
            .ChildKeyColumn("RoleID")
            .Cascade.None();

        //....
    }

    public UserMap()
    {
        Table("CLSYS_User");

        Id(user => user.ID)
            .Column("UserID");

        HasManyToMany(user => user.Roles)
            .Table("CLSYS_User_ApplicationRoles")
            .ParentKeyColumn("UserID")
            .ChildKeyColumn("RoleID")
            .Cascade.None();

        //...

    }

需要的是这样的(上面的UserMap的补充)

   public UserMap()
    {
        //...

        HasMany(user => user.EffectivePermissions)
          //Union ( user -> ApplicationRoles -> permissions)
          //Union ( user -> PaidServices [with active status] -> permissions)
          //Distinct
    }

我希望能够像这样查询这些权限

    _session.Linq<User>().Where(u => u.EffectivePermssions.Contains(somePermission) && user.SomeOtherCriteria == something);

我知道我无法直接修改此集合,这是完全可以接受的。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

作为一个短期解决方案,我创建了一个处理联合逻辑的视图,并具有以下映射:

         HasManyToMany(user => user.EffectivePermissions)
            .Table("VW_CLSYS_User_EffectiveApplicationPermissions")
            .ParentKeyColumn("UserID")
            .ChildKeyColumn("ApplicationPermissionID")
            .Inverse();

这并不理想,因为我更喜欢在用户的映射中使用逻辑。欢迎任何其他建议。