Попытка реализовать относительно простые отношения между 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
по какой-то причине не учитывается.
Это всеИнформация, которую мне удалось найти до сих пор.Пожалуйста, расскажите, что я делаю не так.