NHibernate& Fluent:映射Enum Bitmasks,但作为项目存储在另一个表中

时间:2010-07-04 22:03:50

标签: nhibernate fluent-nhibernate

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

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

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

User_Roles
---
UserID   Role
23       User
23       Other

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

1 个答案:

答案 0 :(得分:0)

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>

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