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