【问题标题】:NHibernate enum Collection MappingNHibernate 枚举集合映射
【发布时间】:2012-09-11 20:06:01
【问题描述】:

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

【问题讨论】:

    标签: c# nhibernate enums


    【解决方案1】:

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

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

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

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

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

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

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

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

    这种方式不受欢迎的场景是需要通过Setting进行查询,例如“选择所有有UpdateRole设置的用户”。

    【讨论】:

    • 这也是我会考虑的一个选项。 :)
    • 如果我使用一组大约 100 个设置,这是否可行?
    • @user1663907 不,你会溢出 32 位整数。
    • 我就是这么想的……你还能想象出其他的解决方案吗?
    【解决方案2】:

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

    <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 枚举的数值。

    【讨论】:

    • 在这种情况下,它们不会是 Thema 数据库中的 Sep erste 表,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多