Fluent nhibernate 映射枚举列表

Fluent nhibernate 映射枚举列表,fluent-nhibernate,enums,string,mapping,Fluent Nhibernate,Enums,String,Mapping,我有一个名为UserPermissions的表,它通过userId向users表发送一个FK,然后是一个字符串列,表示枚举的字符串值 我看到的错误是NHibernate.MappingException:表UserPermissions中的关联引用了未映射的类:GotRoleplay.Core.Domain.Model.Permission 我的权限枚举: public enum Permission { [StringValue("Add User")] AddUser

我有一个名为UserPermissions的表,它通过userId向users表发送一个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; }
我尝试映射我的用户对象的permissions属性:

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

它无法将权限映射到枚举值列表,这有什么不对?

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

HasManyToMany(x => x.Permissions)
         .WithParentKeyColumn("UserId")
         .WithChildKeyColumn("PermissionName")
         .WithTableName("UserPermissions")
         .LazyLoad()
         .CustomTypeIs(typeof(Permission));
编辑以添加:
对不起,我应该注意到你有这么多。这是不可能的:不能让用户集合(m:m的另一面)挂在枚举上。您需要将其定义为1:m,或者创建一个权限表和类,并将其映射为m:m。

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

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

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

    AddUser = 2,

    EditUser = 3,

    DeleteUser = 4
}
接下来,我有我的权限类

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);
    }
}
CREATE TABLE dbo.Permissions
(
    PermissionId                    int                 NOT NULL,
    PermissionName                  varchar (50)        NOT NULL,

    CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId)
)

如果要使用名称而不是整数值,只需稍作修改即可。这取决于你的个人喜好。

以下是我的工作方式

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

查看此处了解更多信息

我尝试使用您的建议,但CustomTypeIs作为有效选项不存在。我尝试改用.CollectionType(typeof(Permission)),但仍然看到相同的错误:UserPermissions表中的关联引用了一个未映射的类:GotRoleplay.Core.Domain.Model.permissions所以经过大量修改,最后,我不得不创建一个名为UserPermission的新对象,并使用我的enum作为数据类型,将其映射到具有权限属性的UserPermissions表。这很好,但是权限可以附加到角色和用户,这意味着我的select查询要获得分配给用户的每个权限(包括其所有角色)需要一组复杂的linq语句。我宁愿不那样做。有人有什么想法吗?谢谢你的帖子。我要试试看!
HasMany(x => x.Licences)
                .WithTableName("DriverLicence")
                .AsElement("Level").AsBag();