2009-05-23 121 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