1

我对 NHibernate 很陌生,我对 NHibernate 中的枚举映射有疑问(不是流利的......)。

枚举是:

public enum Setting
{
    CreateUser,
    CreateRole,
    UpdateUser,
    UpdateRole,
    ...
} 

我还有一个名为“角色”的类,它具有三个属性:

public class Role
{
    long ID;
    string Name;
    ICollection<Setting> Settings;
}

在这个类角色中,我想存储这个特殊角色的所有设置。如果集合中不包含一个设置,则不允许角色执行此操作。

我现在的问题是,如何映射这个类...... 我已经尝试通过 Set 或 Bag 映射这种关系,但这并没有很好地工作。

我可以想象一个数据库模式如下:

+------------+    +------------+    +------------+
| Role       |    | Ref Table  |    | Settings   |
+------------+    +------------+    +------------+
| ID         | FK | Role_ID    | FK | ID         |
| Name       |----| Setting_ID |----| Name       |
+------------+    +------------+    +------------+

到目前为止我是对的吗?有人可以帮我如何用 NHibernate 映射它吗?

到目前为止,谢谢

编辑1:

使用单独的枚举类(带有 ID、名称和许多静态方法)解决了问题。之后,我实现了设置和角色之间的多对多关系。

4

2 回答 2

2

您可以考虑FlagsAttribute在此处使用枚举和位掩码操作。

您将 NHibernate 映射到一个私有或受保护的整数字段,并且您的类将公开一个公共属性,该属性表示Setting从标志中读取的值的集合。

如果您不熟悉FlagsAttribute,请查看位于http://msdn.microsoft.com/en-us/library/system.flagsattribute(v=vs.110).aspx的 MSDN

基本上,它是这样工作的:

CreateUser = 1,
CreateRole = 2,
UpdateUser = 4,
UpdateRole = 8,
…

这些值可以任意组合并表示为整数。例如,具有 CreateUser 和 UpdateUser 权限的用户的值为 5,这不能通过任何其他设置组合来表示。

在我看来,这种方法提供了两全其美:

  • 对于数据库和 NHibernate,只有一个整数列——没有额外的表、没有外键、没有集合、没有连接。
  • 代码中的公共接口保持干净——没有其他类公开或需要位掩码操作。

这种方式不利的场景是需要通过Setting进行查询的场景,例如“select all users with UpdateRole setting”。

于 2012-09-11T20:29:08.390 回答
0

我认为 - 我没有测试过 - 你可以将你的设置集合映射为:

<class name="Role" table="Role">

    <id name="ID" column="ID">
       <generator ... />
    </id>

    <property name="Name" column="Name"/>

    <set name="Settings table="Ref Table">
      <key column="Role_ID" />
      <element column="Setting_ID" type="int" />
    </set>
</class>

我会将枚举映射为数据库中的整数。这可能不是最佳实践,但为了简单起见。否则我认为你必须在 NH 中创建一个用户定义的类型,同时映射整数的数值也可以。执行此操作时,您只需定义集合应映射为包含一个元素的集合,即设置。Setting请注意,在这种情况下,我将明确指定枚举的数值。

于 2012-09-11T20:26:33.417 回答