Убрать с одной стороны многих в Nhibernate - PullRequest
1 голос
/ 08 октября 2010

У меня есть два объекта в 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?

Как выполнить то, что я пытаюсь сделать? (удалить пользователя из роли, обновить роль и сохранить ее)?

Спасибо

1 Ответ

2 голосов
/ 08 октября 2010

Когда вы пишете inverse="true", вы говорите NHibernate, что другая сторона поддерживает отношения.

Следовательно, вы должны удалить Роль из коллекции ролей пользователя , если вы хотите, чтобы ваши изменения были сохранены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...