情景
我一直在撞墙,试图找出3个实体的正确映射:用户,角色和权限。在我的应用程序中,用户可以拥有权限,这只是为用户提供了额外的权限。用户还可以拥有角色,这些角色本质上是需要其他属性的权限。
例如,用户可能具有“应用程序管理员”角色,在这种情况下,ApplicationAdministratorRole.cs需要一个属性来包含用户可以管理的应用程序列表。用户还可以拥有“事件管理员”权限,在这种情况下,Privilege.cs不会包含事件的任何其他属性,因为在我们的应用程序中,事件管理员可以管理所有事件。我希望这个例子有意义。如果没有,我可以再说一点。
表格结构
[表名] TBL_USERS
[列] UserId(PK), 名字, 姓, CompanyId, 等...
[表名] TBL_ROLEREF(只定义系统中的角色)
[列] RoleId(PK), ROLENAME
[表名] TBL_USERROLES(将用户与角色交叉引用的表)
[列] UserRoleId(PK), 用户身份, 角色ID, ActiveDate, DeactiveDate
[表名] TBL_APPLICATIONADMINISTRATORS
[列] ApplicationAdministratorId(PK), 的applicationID, 用户身份, 角色ID, ActiveDate, DeactiveDate
[表名] TBL_PRIVILEGEREF
[列] PrivilegeId(PK), PrivilegeName
[表名] TBL_USERPRIVILEGES
[列] UserPrivilegeId(PK), 用户身份, PrivilegeId, ActiveDate, DeactiveDate
表结构非常简单,所有权限和角色都有ActiveDate和DeactiveDate,以便我们可以维护用户以前的角色和权限的历史记录。需要注意的一点是,任何角色都需要一个附加表来存储与此角色一起出现的任何其他信息,在这种情况下,TBL_APPLICATIONADMINISTRATORS会将用户的应用程序管理员角色绑定到TBL_APPLICATIONREF中的不同应用程序。请再次告诉我,如果我需要重新说明这一点以便更好地理解。
映射文件
[User.hbm.xml]
用户对象应具有权限和角色的集合。这些袋子可能应该是套装,但是为了这个例子,我觉得它不重要。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Core" namespace="Core">
<class name="Core.Entities.User, Core" table="TBL_USERS">
<id name="UserId" column="USERID" type="Int32" unsaved-value="0">
<generator class="sequence">
<param name="sequence">SEQ_TBL_USERS</param>
</generator>
</id>
<property name="Title" column="USERTITLE" type="string" length="50" not-null="false" />
<property name="FirstName" column="USERFIRSTNAME" type="string" length="50" not-null="true" />
<property name="LastName" column="USERLASTNAME" type="string" length="50" not-null="true" />
<bag name="Privileges" generic="true" table="TBL_USERPRIVILEGES">
<key column="USERID" />
<many-to-many column="PRIVILEGEID" class="Core.Entities.Privilege, Core" />
</bag>
<bag name="Roles" generic="true" table="TBL_USERROLES" >
<key column="USERID" />
<many-to-many column="ROLEID" class="Core.Entities.Role, Core" />
</bag>
</class>
</hibernate-mapping>
[Privilege.hbm.xml]
权限对象应具有PrivilegeId,PrivilegeName,与权限关联的用户集合以及ActiveDate / DeactiveDate。我已经注释了我未能尝试映射这个。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Core" namespace="Core">
<class name="Core.Entities.Privilege, Core" table="TBL_PRIVILEGEREF">
<id name="PrivilegeId" column="PRIVILEGEID" type="Int32" unsaved-value="0">
<generator class="sequence">
<param name="sequence">SEQ_TBL_USERPRIVILEGES</param>
</generator>
</id>
<property name="Name" column="PRIVILEGENAME" type="string" length="128" not-null="false" />
<!--
This does not work. NHibernate is complaining about the repeated Column "USERID"
I have made several attempts to get this to work with no luck... where am I going wrong?
<bag name="Users" generic="true" table="TBL_USERPRIVILEGES" inverse="true">
<key column="USERID" />
<many-to-many column="USERID" class="Core.Entities.User, Core" />
</bag>
-->
<!--
This also does not work. This was my attempt to join the ActiveDate and DeactiveDate into Privilege.cs
The join NHibernate creates with this setup is completely wrong...
<join table="TBL_USERPRIVILEGES">
<key column="USERPRIVILEGEID" />
<property name="ActiveDate" column="ACTIVEDATE" type="DateTime" not-null="false" />
<property name="DeactiveDate" column="DEACTIVEDATE" type="DateTime" not-null="false" />
</join>
-->
</class>
</hibernate-mapping>
[Role.hbm.xml]
我希望有一个Role基类,它具有ActiveDate和DeactiveDate的属性,每个角色(如ApplicationAdministratorRole)都可以继承,以便每个角色都被强制拥有这些属性。我想我也可以使用一个界面来强制执行此操作,但这是我第一次在NHibernate中映射一些半复杂的东西,所以请给我一些指导。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Core" namespace="Core">
<class name="Core.Entities.Role, Core" table="TBL_ROLEREF">
<id name="RoleId" column="ROLEID" type="Int32" unsaved-value="0">
<generator class="sequence">
<param name="sequence">SEQ_TBL_USERROLES</param>
</generator>
</id>
<property name="Name" column="ROLENAME" type="string" length="128" not-null="false" />
<bag name="Users" generic="true" table="TBL_USERROLES">
<key column="ROLEID" />
<many-to-many column="USERID" class="Core.Entities.User, Core" />
</bag>
<joined-subclass name="Core.Entities.ApplicationAdministratorRole, Core" table="TBL_APPLICATIONADMINISTRATORS" extends="Core.Entities.Role, Core">
<key column="ROLEID" />
<property name="ApplicationAdministratorId" column="APPLICATIONADMINISTRATORID" type="Int32" />
<bag name="Applications" generic="true" table="TBL_APPLICATIONREF">
<key column="APPLICATIONID" />
<one-to-many class="Core.Entities.Application, Core" />
</bag>
</joined-subclass>
<!-- Do I need to use <join> here to set the ActiveDate and DeactiveDate in the Role base class? -->
</class>
</hibernate-mapping>
我已经对这些东西做过很多阅读,但我显然错过了一些东西。正如您可能已经收集的那样,我正在为角色实现每子类的表格。
这些映射文件按原样工作,但它们不会返回正确的结果。非常感谢任何和所有帮助。
谢谢你们,
约什
答案 0 :(得分:3)
您尝试在使用USERID两次时映射用户,既作为键又作为参考。 你可能意味着:
我不明白这一点,TBL_PRIVILEGEREF和TBL_USERPRIVILEGES之间的关系是什么,似乎没有:
你加入 - 子类映射似乎很好