gpt4 book ai didi

nhibernate - FluentNHibernate 和枚举

转载 作者:行者123 更新时间:2023-12-03 16:49:59 29 4
gpt4 key购买 nike

我有一个名为权限的枚举。可以为用户分配权限,也可以为角色分配权限,然后为用户分配角色。

User 和 Role 都有这样的属性:

public virtual IList<Permission> Permissions { get; set; }

我想为权限使用枚举,所以在我的代码中我可以做类似的事情

public static bool UserHasPermission(Permission.DeleteUser)

现在我的枚举中有大约 50 种不同的权限。如果我不必在数据库中填充一组镜像数据就好了。我的枚举看起来像这样:

public enum Permission
{
//site permissions 1-99
[StringValue("View Users")]
ViewUser = 1,

[StringValue("Add User")]
AddUser = 2,

[StringValue("Edit User")]
EditUser = 3,

[StringValue("Delete User")]
DeleteUser = 4

...

}

目前,我有一个权限表,它是 PermissionId (int) 和 PermissionName (varchar (50))。

这是我在角色方面的表格。就权限而言,用户端完全相同:

CREATE TABLE dbo.Roles
(
RoleId int IDENTITY(2,1) NOT NULL,
RoleName varchar (50) NOT NULL,

CONSTRAINT PK_Roles PRIMARY KEY CLUSTERED (RoleId)
)

CREATE TABLE dbo.RolePermissions
(
RolePermissionId int IDENTITY(1,1) NOT NULL,
RoleId int NOT NULL,
PermissionId int NOT NULL,

CONSTRAINT PK_RolePermissions PRIMARY KEY CLUSTERED (RolePermissionId),
CONSTRAINT FK_RolePermissions_Roles FOREIGN KEY (RoleId) REFERENCES Roles(RoleId),
CONSTRAINT U_RolePermissions UNIQUE(RoleId, PermissionId)
)

然后,我有一个权限表以备不时之需,但我只是不知道如何将 RolePermissions 中的 id 字段或权限表映射回枚举。

CREATE TABLE dbo.Permissions
(
PermissionId int NOT NULL,
PermissionName varchar (50) NOT NULL,

CONSTRAINT PK_Permissions PRIMARY KEY CLUSTERED (PermissionId)
)
  1. 我可以将枚举映射到表吗?
  2. 我应该映射它,还是只取出 Permissions 表并在 UserPermissions 和 RolePermissions 中只保留 PermissionId 一个 int 并将其映射到枚举?
  3. 如果我保留 Permissions 表,nhibernate 是否可以通过枚举中的数据自动填充 Permissions 表中的数据?

现在,除了像这样的东西,我没有映射到权限枚举:

HasManyToMany(x => x.Permissions)
.WithParentKeyColumn("RoleId")
.WithChildKeyColumn("PermissionId")
.WithTableName("RolePermissions")
.LazyLoad()
.Cascade.All();

不幸的是,这会导致错误:

An association from the table RolePermissions refers to an unmapped class: GotRoleplay.Core.Domain.Model.Permission

我对枚举做错了什么?当枚举是对象上的值列表而不仅仅是单个值时,是否有将它们与 fluentnhibernate 一起使用的标准方法或最佳实践?

最佳答案

只是为了确保我理解,您是否试图将类中的枚举属性映射到数据库中的字段?如果是这样,那么这里有一个如何做到这一点的例子:

public class Toy {
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual ToyCondition Condition { get; set; }
}

public enum ToyCondition {
New,
Used
}

public class ToyMap : ClassMap<Toy> {
public ToyMap() {
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Condition).CustomTypeIs(typeof(ToyCondition));
}
}

之后,您可以像正常使用 ToyCondition 枚举一样使用 Condition 属性获取、设置和执行逻辑。

Toy newToy = new Toy();
newToy.Condition = ToyCondition.New;
toyRepository.Save(newToy);

在数据库中对于Condition字段,它应该是一个int。我希望这是有道理的并回答你的问题。抱歉,如果没有,我就走了。

编辑:抱歉,我刚注意到你问了这个问题,有人给了你和我一样的答案。我想我帮不了你这个。 :(

关于nhibernate - FluentNHibernate 和枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/978788/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com