2009-05-23 72 views
3

我有一個名爲UserPermissions的表,用userId將一個FK表映射到用戶表,然後是一個字符串列,用於枚舉的字符串值。映射一個枚舉的列表

我看到的錯誤NHibernate.MappingException:從表中UserPermissions的關聯是指未映射類:GotRoleplay.Core.Domain.Model.Permission

我的許可枚舉:

public enum Permission 
{ 
    [StringValue("Add User")] 
    AddUser, 

    [StringValue("Edit User")] 
    EditUser, 

    [StringValue("Delete User")] 
    DeleteUser, 

    [StringValue("Add Content")] 
    AddContent, 

    [StringValue("Edit Content")] 
    EditContent, 

    [StringValue("Delete Content")] 
    DeleteContent, 
} 

在我的User類的屬性:

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

我的數據庫表:

CREATE TABLE dbo.UserPermissions 
(
UserPermissionId   int     IDENTITY(1,1) NOT NULL, 
UserId      int     NOT NULL, 
PermissionName    varchar (50)  NOT NULL, 

CONSTRAINT PK_UserPermissions PRIMARY KEY CLUSTERED (UserPermissionId), 
CONSTRAINT FK_UserPermissions_Users FOREIGN KEY (UserId) REFERENCES Users(UserId), 
CONSTRAINT U_User_Permission UNIQUE(UserId, PermissionName) 
) 

我試圖在我的映射用戶對象的權限屬性:

HasManyToMany(x => x.Permissions) 
      .WithParentKeyColumn("UserId") 
      .WithChildKeyColumn("PermissionName") 
      .WithTableName("UserPermissions") 
      .LazyLoad(); 

什麼我做錯了,它不能映射權限枚舉值列表?

+0

所以很多修修補補之後,我最後不得不創建一個名爲UserPermission新對象,並將其映射到具有Permission屬性的UserPermissions表使用我的枚舉作爲數據類型。這工作正常,但權限可以附加到角色和用戶,這意味着我的選擇查詢獲得分配給用戶的所有權限(包括他們的所有角色)需要一組複雜的linq語句。我寧願不這樣做。有人有主意嗎? – Josh 2009-05-27 01:02:26

回答

1

我想我會發布我爲我的解決方案選擇的代碼。這只是一個解決方法。我希望Fluent支持Enum列表,但在這之前,這裏有一個可能的解決方案:

Enum - 這是我的枚舉,你的標準枚舉。

public enum PermissionCode 
{ 
    //site permissions 1-99 
    ViewUser = 1, 

    AddUser = 2, 

    EditUser = 3, 

    DeleteUser = 4 
} 

接下來,我有我的權限類。您可以看到,我有一個ID和一個名稱,然後是一個將Id轉換爲我的PermissionCode枚舉的屬性。

的映射是這樣的:

public class PermissionMap : ClassMap<Permission> 
{ 
    public PermissionMap() 
    { 
     WithTable("Permissions"); 

     Id(x => x.PermissionId).GeneratedBy.Identity(); 

     Map(x => x.PermissionName); 
    } 
} 

由於PermissionCode屬性派生,我們不映射做任何事情。映射背後

我的表結構如下:

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

    CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId) 
) 

如果你想使用的名稱,而不是整數值,你可以稍作修改。這取決於你的個人喜好。

1

您需要指定類型,以便NHibernate可以將表中的值轉換爲Permission枚舉的成員。

HasManyToMany(x => x.Permissions) 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("PermissionName") 
     .WithTableName("UserPermissions") 
     .LazyLoad() 
     .CustomTypeIs(typeof(Permission)); 

編輯補充: 對不起,我應該已經注意到了,你有這是多對多。這是不可能的:你不能有一個用戶集合(m:m的另一邊)懸掛一個枚舉。您需要將其定義爲1:m或創建權限表和類,並將其映射爲m:m。

+0

我嘗試使用您的建議,並且CustomTypeIs不存在作爲有效的選項。我嘗試使用.CollectionType(typeof(Permission)),但我仍然看到相同的錯誤:來自表UserPermissions的關聯引用了未映射的類:GotRoleplay.Core.Domain.Model.Permission – Josh 2009-05-24 00:35:47

3

這裏是爲我工作

HasMany(x => x.Licences) 
       .WithTableName("DriverLicence") 
       .AsElement("Level").AsBag(); 

看看這裏獲取更多信息的方式answer

+0

感謝您的發佈。我會試一試! – Josh 2009-09-15 12:30:12