Fluent nhibernate 映射枚举列表
我有一个名为UserPermissions的表,它通过userId向users表发送一个FK,然后是一个字符串列,表示枚举的字符串值 我看到的错误是NHibernate.MappingException:表UserPermissions中的关联引用了未映射的类:GotRoleplay.Core.Domain.Model.Permission 我的权限枚举: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
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();