从Nhibernate中多对多的一侧移除

从Nhibernate中多对多的一侧移除,nhibernate,nhibernate-mapping,many-to-many,Nhibernate,Nhibernate Mapping,Many To Many,我在NHibernate中有两个对象,它们形成了多对多关系: 用户: 它不起作用:(关联在数据库中保持不变。当我尝试相反的方法(从用户对象中删除角色并更新用户对象)时,它起作用。 是因为NHibernate映射中的逆属性吗 如何完成我要做的事情?(从角色中删除用户,更新角色并保持该角色) 感谢您在编写inverse=“true”时告诉NHibernate另一方保持着这种关系 因此,如果您想保留更改,必须从用户的角色集合中删除角色。谢谢Diego,您知道删除角色并删除其所有关联的HQL命令是什么吗

我在NHibernate中有两个对象,它们形成了多对多关系:

用户:

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

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


感谢您在编写
inverse=“true”
时告诉NHibernate另一方保持着这种关系


因此,如果您想保留更改,必须从用户的角色集合中删除角色。

谢谢Diego,您知道删除角色并删除其所有关联的HQL命令是什么吗(不是删除用户,而是删除与用户的关联)?我很难找到这一点。如果我迭代所有用户并调用会话。删除每个用户,我将有许多到数据库的往返(在某些情况下可能有数百次)。如果使用批处理,您将不会有这么多的往返,请参阅
<?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>
var backupoperator = GetRoleByName(session, app.ApplicationId, "backupoperator");
backupoperator.Users.RemoveAt(0);
session.Update(backupoperator);
transaction.Commit();