【问题标题】:nhibernate many-to-many mapping - additional column in the mapping table?nhibernate 多对多映射 - 映射表中的附加列?
【发布时间】:2009-05-21 23:28:50
【问题描述】:

我有以下映射定义:

  <class name="Role" table="Role" optimistic-lock="version" >

    <id name="Id" type="Int32" unsaved-value="0" >
      <generator class="native" />
    </id>

    <property name="RoleName" type="String(40)" not-null="true" />

    <bag name="UsersInRole" generic="true" lazy="true" cascade="all" table="UserRoles" >
      <key  column="RoleId" />
      <many-to-many column="UserId" class="SystemUser, Domain"/>
    </bag>

<id name="Id" type="Int32" unsaved-value="0" >
  <generator class="native" />
</id>
<property name="UserName" type="String(40)" not-null="true" unique="true" />

此映射生成映射表 UserRoles,其中包含两列 - RoleId 和 UserId。

但是,我想为该关系添加额外的属性 - 即一些定义关系状态的枚举值以及有效的开始和结束日期。

是否可以在 nhibernate 中执行或者我需要在此处添加其他类并将关系 m-to-m 更改为 2 个关系 [user] 1-to-m [user_role] m-to-1 [role] ?

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    您需要添加一个额外的类,例如UserRole,在代码中保留附加属性。

    当涉及到映射时,可以将其映射为您提到的类。但我也认为它可以映射为角色映射中的复合元素:

    <set name="UsersInRole" lazy="true" table="UserRoles" >
      <key  column="RoleId" />
      <composite-element class="UserRole">
         <many-to-one name="User" column="UserId" not-null="true"/>
         <propery name="RelationState" not-null="true"/>
         <propery name="StartDate" not-null="true"/>
         <propery name="EndDate" not-null="true"/>
      </composite-element>
    </set>
    

    所有属性都必须不为空,因为它们已成为 UserRoles 表的主键的一部分。欲了解更多信息,请参阅:

    【讨论】:

      【解决方案2】:

      添加额外的类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多