NHibernate 和 NHibernate Fluent:映射枚举位掩码,但作为项目存储在另一个表中

发布于 2024-09-08 15:03:47 字数 387 浏览 2 评论 0原文

我有一个名为 User 的类。用户可以拥有一个或多个角色,这些角色在位掩码枚举中定义。用户有一个 Role 属性,我可以通过以下方式使用:

user.Roles = Roles.User | Roles.Other;

在数据库中,我有一个 Users 表和一个 User_Roles 表。对于用户拥有的每个角色,我想将其与 UserID 和角色的字符串表示形式存储在 Users_Roles 表中。例如,为前面的示例存储的数据将是:

User_Roles
---
UserID   Role
23       User
23       Other

我将如何创建此映射?我已经阅读了这些示例,它们似乎都将其直接映射到用户表。

I have a class called User. User can have one or more roles, defined in an bitmask enum. The user has a Role property that i can use via:

user.Roles = Roles.User | Roles.Other;

In the database I have a Users table and a User_Roles table. For every role that a user has, i want to store it in the Users_Roles table with the UserID and the string representation of the Role. for example, the data stored for the previous example would be:

User_Roles
---
UserID   Role
23       User
23       Other

how would i create the mapping on this? i've read the examples, and they all seem to map it straight to the User table.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倒带 2024-09-15 15:03:47

NHibernate 不会将单个值映射到表,但您可以在枚举上使用 Linq-to-object 投影:

protected virtual ICollection<Roles> RolesCollection
{
    get
    {
        return Enum.GetValues(typeof(Roles))
                   .Cast<Roles>()
                   .Where(r => (r & Roles) == r)
                   .ToList();
    }
    set
    {
        Roles = value.Aggregate((r1, r2) => r1 | r2);
    }
}

然后将其映射为集合:

<set name="RolesCollection" table="User_Roles">
  <key column="UserID" />
  <element type="Roles" /><!--you might have to qualify the type-->
</set>

如您所见,您甚至不需要创建集合属性公开,因此这对应用程序的其余部分是透明的。

NHibernate will not map a single value to a table, but you can use a Linq-to-object projection on the enum:

protected virtual ICollection<Roles> RolesCollection
{
    get
    {
        return Enum.GetValues(typeof(Roles))
                   .Cast<Roles>()
                   .Where(r => (r & Roles) == r)
                   .ToList();
    }
    set
    {
        Roles = value.Aggregate((r1, r2) => r1 | r2);
    }
}

And then map it as a set:

<set name="RolesCollection" table="User_Roles">
  <key column="UserID" />
  <element type="Roles" /><!--you might have to qualify the type-->
</set>

As you can see, you don't even need to make the collection property public, so this is transparent to the rest of your application.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文