映射枚举列表

时间:2009-05-23 07:30:04

标签: fluent-nhibernate enums string mapping

我有一个名为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,
}

我的用户类中的属性:

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();

我无法将权限映射到枚举值列表?

3 个答案:

答案 0 :(得分:3)

这是对我有用的方式

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

在此处查看更多信息answer

答案 1 :(得分:1)

您需要指定类型,以便NHibernate可以将表中的值转换为Permission枚举的成员。

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

编辑添加: 对不起,我应该注意到你有这个和ManyToMany一样。这是不可能的:你不能有一个用户集合(m:m的另一面)悬挂枚举。您需要将其定义为1:m或创建一个Permission表和类,并将其映射为m:m。

答案 2 :(得分:1)

我以为我会发布我为解决方案选择的代码。这只是一种解决方法。我希望Fluent支持Enum列表,但在此之前,这是一个可能的解决方案:

Enum - 这是我的枚举,你的标准枚举。

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

    AddUser = 2,

    EditUser = 3,

    DeleteUser = 4
}

接下来,我有我的Permission课程。

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

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

如您所见,我有一个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)
)

如果您想使用名称而不是整数值,可以稍作修改。这取决于您的个人喜好。