Еще один вопрос NHibernate для многих - PullRequest
0 голосов
/ 28 июня 2010

Попытка реализовать относительно простые отношения между User и Role.User может быть во многих ролях, один и тот же Role может принадлежать любому числу User с.Role s являются общими, т.е. все admin User s относятся к одному и тому же экземпляру класса Role.

User mapping:

 <class name="User" lazy="false" table="Users">
  <id name="Id" type="int">
    <generator class="native"/>
  </id>
  <property name="Name" column="Username" />
  <bag name="RoleList" table="User_Role" inverse="true" lazy="false" cascade="save-update">
    <key column="UserId" foreign-key="Id"/>
    <many-to-many class="Role" column="RoleId"/>
  </bag>
 </class>

Role отображение:

  <class name="Role" lazy="false" table="Roles">
    <id name="Id" type="int">
      <generator class="native"/>
    </id>
    <property name="Name" column="Rolename"/>
    <property name="Description"/>
  </class>

Существует три таблицы БД: одна для User с, одна для Role с и третья для отношения «многие ко многим» (с двумявнешние ключи: UserId и RoleId).Первичный ключ - это составной ключ этих двух.

Проблемный сценарий : роли предопределены.В своем коде на C # я создаю пользователя , в то же время прикрепляя к нему роль .Роль - это объект, который был успешно извлечен из БД с правильным id .Я пытаюсь сохранить этого пользователя в базе данных.

Теперь на вопрос : я получаю дубликат ключа Ошибка БД, посколькуNHibernate пытается вставить объект Role в соответствующую таблицу.Поскольку RoleId уже принадлежит существующей роли , я ожидаю, что в БД не будет вставлена ​​новая роль.

Подробная информация о Gory : я такжепопытался отладить NHibernate и увидел, что по какой-то причине EntityIdentityInsertAction получает Role и вызывает базовый конструктор.В вызове базового конструктора параметр Id является простым жестко заданным кодом null .Трассировка стека также содержит вызов SaveWithGeneratedId() (где-то ранее в цепочке), что означает, что Id для существующего объекта Role по какой-то причине не учитывается.

Это всеИнформация, которую мне удалось найти до сих пор.Пожалуйста, расскажите, что я делаю не так.

1 Ответ

1 голос
/ 28 июня 2010

Моя первая инстинктивная реакция заключается в том, что вы не хотите, чтобы cascade = "save-update" в коллекции ролей от пользователя.

Вы хотели бы этого, только если вы хотите внести изменения вфактические роли, которые будут сохранены / обновлены при сохранении пользователя.

Я предполагаю, что после того, как вы работали, была сохранена связь, но это происходит независимо от настроек каскада.

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