我有一个名为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();
我无法将权限映射到枚举值列表?
答案 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)
)
如果您想使用名称而不是整数值,可以稍作修改。这取决于您的个人喜好。