NHibernate枚举集合映射

时间:2012-09-11 20:06:02

标签: c# nhibernate enums

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

枚举是:

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

我还有一个名为" Role"它有三个属性:

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,名称和许多静态方法)解决了这个问题。之后,我在Setting和Role之间实现了多对多的关系。

2 个答案:

答案 0 :(得分: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只有一个整数列 - 没有其他表,没有外键,没有集合,没有连接。
  • 代码中的公共接口保持干净 - 其他类不会公开或要求任何位掩码操作。

此方法不利的方案是您需要通过设置查询,例如“选择所有具有UpdateRole设置的用户。”

答案 1 :(得分: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>

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