2010-06-28 2 views
0

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

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

ответ

1

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

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

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

Смежные вопросы