NHibernate中的只读已加入集合

NHibernate中的只读已加入集合,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,基本情况如下。在我们的应用程序中,我们有角色和权限。角色和权限之间存在多对多关系。关键在于,用户可以直接被分配角色,或者他们可以拥有通过付费获得的角色。为了让事情变得更有趣,如果用户取消了付费服务,或者该服务过期,那么他们就不应该再担任该角色。我的问题是,我希望对任何给定用户拥有一个有效权限的(只读)集合,并且我希望能够对其进行查询。一些映射细节: public ApplicationPermissionMap() { Table("CLSYS_Applicati

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

    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的一个补充)

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

    _session.Linq<User>().Where(u => u.EffectivePermssions.Contains(somePermission) && user.SomeOtherCriteria == something);
\u session.Linq()。其中(u=>u.effectivepermissions.Contains(somePermission)和&user.SomeOtherCriteria==something);

我知道我不能直接修改这个集合,这是完全可以接受的。有人能帮我解决这个映射问题吗?

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

         HasManyToMany(user => user.EffectivePermissions)
            .Table("VW_CLSYS_User_EffectiveApplicationPermissions")
            .ParentKeyColumn("UserID")
            .ChildKeyColumn("ApplicationPermissionID")
            .Inverse();
这并不理想,因为我更希望在映射中为用户提供逻辑。欢迎提出任何其他建议

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