3

我有一个名为权限的枚举。可以为用户分配权限,或者可以将权限分配给角色,并且可以为用户分配角色。FluentNHibernate和枚举

用户和角色都具有这样的特性:

public virtual IList<Permission> Permissions { get; set; } 

我想用一个枚举的权限,以便在我的代码我可以这样做

public static bool UserHasPermission(Permission.DeleteUser) 

事情现在我有我的枚举中有50个不同的权限。如果我不必在数据库中填充镜像数据集,那将会很好。我列举如下:

public enum Permission 
    { 
     //site permissions 1-99 
     [StringValue("View Users")] 
     ViewUser = 1, 

     [StringValue("Add User")] 
     AddUser = 2, 

     [StringValue("Edit User")] 
     EditUser = 3, 

     [StringValue("Delete User")] 
     DeleteUser = 4 

     ... 

} 

目前,我有权限的表是PermissionId(int)和PermissionName(VARCHAR(50))。

这是我在角色方面的表格。用户侧是完全一样的,只要权限去:

CREATE TABLE dbo.Roles 
(
    RoleId      int     IDENTITY(2,1) NOT NULL, 
    RoleName     varchar (50)  NOT NULL, 

    CONSTRAINT PK_Roles PRIMARY KEY CLUSTERED (RoleId) 
) 

CREATE TABLE dbo.RolePermissions 
(
    RolePermissionId   int     IDENTITY(1,1) NOT NULL, 
    RoleId      int     NOT NULL, 
    PermissionId    int     NOT NULL, 

    CONSTRAINT PK_RolePermissions PRIMARY KEY CLUSTERED (RolePermissionId), 
    CONSTRAINT FK_RolePermissions_Roles FOREIGN KEY (RoleId) REFERENCES Roles(RoleId), 
    CONSTRAINT U_RolePermissions UNIQUE(RoleId, PermissionId) 
) 

然后,我有一个权限的情况下,我tble需要,但我只是不明白如何可以id字段中RolePermissions地图或权限表返回到枚举。

CREATE TABLE dbo.Permissions 
(
    PermissionId     int     NOT NULL, 
    PermissionName     varchar (50)  NOT NULL, 

    CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId) 
) 
  1. 我可以映射枚举表?
  2. 我应该甚至映射它,还是应该取出权限表,并在UserPermissions和RolePermissions中将PermissionId只留下一个int并将其映射到枚举中?
  3. 如果我保留权限表,那么是否有一种方法可以让nhibernate从枚举中的数据自动填充权限表中的数据?

现在,我都没有映射到权限枚举,不是像这样其他:

HasManyToMany(x => x.Permissions) 
       .WithParentKeyColumn("RoleId") 
       .WithChildKeyColumn("PermissionId") 
       .WithTableName("RolePermissions") 
       .LazyLoad() 
       .Cascade.All(); 

不幸的是,这将导致一个错误:

An association from the table RolePermissions refers to an unmapped class: GotRoleplay.Core.Domain.Model.Permission

我在做什么错与枚举?当enum是对象上的值列表而不仅仅是单个值时,是否有一种标准方式或最佳实践来使用它们与fluentnhibernate?

回答

0

因此,在与其他开发人员聊天的几天后,在网上挖掘并发布到谷歌上的FluentNHibernate组,我发现目前还没有完全支持枚举集合。做我想做的事,嗯,这是无证或替代方法。

于是,我又回到了绘图板与我在做什么,真正想过这个问题。基本上,我唯一的选择是使用一类我的权限但是,我想在代码中使用我的枚举,这就是当它打我的时候.PermissionId字段可以从int转换为enum,反之亦然。另外,使用一些我以前使用枚举的逻辑使用内置的ASP.NET提供程序的角色,我可以编写一个将构建permis的管理工具sions基于我的枚举中的内容。

首先,我重命名了我的枚举。

public enum PermissionCode 
    { 
     //site permissions 1-99 
     [StringValue("View Users")] 
     ViewUser = 1, 

     [StringValue("Add User")] 
     AddUser = 2, 

     [StringValue("Edit User")] 
     EditUser = 3, 

     [StringValue("Delete User")] 
     DeleteUser = 4, 
    } 

然后,我创建了一个新的Permission类。这个类镜像数据库,只是一个int Id和一个字符串名称。但是,我添加了一个属性将该ID转换为我的PermissionCode枚举。

public class Permission 
    { 
     public virtual int PermissionId { get; set; } 
     public virtual string PermissionName { get; set; } 

     public virtual PermissionCode PermissionCode 
     { 
      get 
      { 
       return (PermissionCode)PermissionId; 
      } 
     } 
    } 

然后,在我的用户和角色的对象,我引用权限,我还可以做像布尔UserHasPermission对决(PermissionCode.DeleteUser);

然后在global.asax中,在Application_Start上,我将检查webconfig的标志,该标志将指示是否需要重建权限。这样我可以只在需要时才能启用重建,而无需获得进入权限并可能需要处理错误。这意味着我只在我的枚举中保留一个权限列表,这是理想的。

当然,整体方法并不像我想要的那样光滑,但它的工作原理。有没有人有任何其他建议?

+1

我无法帮助您提供更好的解决方案,但我很高兴您找到了答案。 – CalebHC 2009-07-09 07:10:25

0

为了确保我明白,你是否试图将类中的枚举属性映射到数据库中的字段?如果是这样的话,那么这里有一个如何做到这一点的例子:

public class Toy { 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual ToyCondition Condition { get; set; } 
} 

public enum ToyCondition { 
    New, 
    Used 
} 

public class ToyMap : ClassMap<Toy> { 
    public ToyMap() { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Condition).CustomTypeIs(typeof(ToyCondition)); 
    } 
} 

之后,你可以获取,设置和使用ToyCondition枚举做逻辑与条件属性就像正常的。

Toy newToy = new Toy(); 
newToy.Condition = ToyCondition.New; 
toyRepository.Save(newToy); 

在Condition字段的数据库中,它应该是一个int。我希望这是有道理的,并回答你的问题。对不起,如果没有,我走了。

编辑: 对不起,我刚刚注意到你问这个问题,有人给了我同样的答案。我认为我不能帮你。:(

+0

我的问题是它不是一个枚举的单个实例。这是一个值列表。我无法用相同的方式绘制它。 CustomTypeIs在您收藏时无法使用。 – Josh 2009-06-12 04:40:34