我对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之间实现了多对多的关系。
答案 0 :(得分:2)
您可以考虑在此处使用枚举FlagsAttribute
和位掩码操作。
您可以将NHibernate映射到一个整数的私有或受保护字段,并且您的类将公开一个公共属性,该属性表示从标志中读取的Setting
值集合。
如果您不熟悉FlagsAttribute
,请在http://msdn.microsoft.com/en-us/library/system.flagsattribute(v=vs.110).aspx
基本上,它的工作原理如下:
CreateUser = 1,
CreateRole = 2,
UpdateUser = 4,
UpdateRole = 8,
…
这些值可以任意组合组合,并以整数表示。例如,具有CreateUser和UpdateUser权限的用户将具有值5,并且这不能由任何其他设置组合表示。
在我看来,这种方法提供了两全其美的优势:
此方法不利的方案是您需要通过设置查询,例如“选择所有具有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
枚举的数值。