Попытка реализовать относительно простую связь между User
и Role
. User
может быть во многих ролях, то же самое Role
может принадлежать любому числу User
s. Role
s являются общими, то есть все adminUser
s относятся к тому же экземпляру класса Role
.Еще один вопрос для многих NHBernate
User
отображение:
<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>
Есть три DB таблицы: один для User
с, один для Role
с, а третий является для многих ко многим (с двумя внешними ключами: UserId
и RoleId
). Первичный ключ - это составной ключ этих двух.
Проблемный сценарий : роли предопределены. В моем коде C# я создаю пользователя , при этом присоединяю к нему роль. Роль - это объект, который был успешно извлечен из БД с правильным id. Я пытаюсь сохранить этот пользователь в базе данных.
Теперь к вопросу : Я получаю дубликат ключа DB ошибки, так как NHibernate пытается вставить Role
объект в соответствующую таблицу. Поскольку RoleId
уже принадлежит существующей роли , я бы ожидал, что в БД не будет добавлена новая роль.
окровавленные детали: Я также пытался отладить NHibernate и увидел, что по какой-то причине EntityIdentityInsertAction
получает Role
и вызывает базовый конструктор. При вызове базового конструктора параметр Id
представляет собой простой жестко закодированный нуль. Трассировка стека также содержит вызов SaveWithGeneratedId()
(где-то ранее в цепочке), что означает, что Id
для существующего объекта Role
не подсчитывается по какой-либо причине.
Это все, что мне удалось найти до сих пор. Скажите, что я делаю неправильно.