在Nhibernate中从多对多的一侧移除

时间:2010-10-07 22:13:36

标签: nhibernate nhibernate-mapping many-to-many

我在NHibernate中有这两个对象形成了多对多的关系:

用户:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Providers" namespace="Providers.Objects">

  <class name="User" table="Users">

    <id name="UserId" type="int">
      <generator class="native" />
    </id>

    <many-to-one name="Application" column="ApplicationId" cascade="none" />    

    <property name="UserName" type="string" />
    <property name="LoweredUserName" type="string" />
    <property name="MobileAlias" type="string" />
    <property name="IsAnonymous" type="bool" />
    <property name="LastActivityDate" type="DateTime" />

    <bag name="Roles" table="UsersInRoles" lazy="true" cascade="none" >
      <key column="UserId"></key>
      <many-to-many class="Role" column="RoleId"></many-to-many>
    </bag>

  </class>

</hibernate-mapping>

角色:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Providers" namespace="Providers.Objects">

  <class name="Role" table="Roles">

    <id name="RoleId" type="int">
      <generator class="native" />
    </id>

    <many-to-one name="Application" column="ApplicationId" class="Application" cascade="none" />    

    <property name="RoleName" type="string" />
    <property name="LoweredRoleName" type="string" />
    <property name="Description" type="string" />

    <bag name="Users" table="UsersInRoles" lazy="true" inverse="true" cascade="none" >
      <key column="RoleId"></key>
      <many-to-many class="User" column="UserId"></many-to-many>
    </bag>

  </class>

</hibernate-mapping>

让我们说角色backupoperator中有一些用户。如果我尝试从角色实例中删除其中一个用户,例如:

var backupoperator = GetRoleByName(session, app.ApplicationId, "backupoperator");
backupoperator.Users.RemoveAt(0);
session.Update(backupoperator);
transaction.Commit();

它不起作用:(关联在数据库中保持不变。当我尝试相反(从用户对象中删除角色并更新用户对象)时,它可以工作。 是因为NHibernate映射中的inverse属性吗?

如何完成我想要做的事情? (从角色中删除用户,更新角色并保留该角色?)

谢谢

1 个答案:

答案 0 :(得分:2)

当你写inverse="true"时,你告诉NHibernate 其他方保持这种关系。

因此,如果您希望保持更改,则必须从用户的角色集合中删除角色