Я унаследовал приложение Spring + NHibernate c #, над которым мы проводим капитальный ремонт (и я довольно новичок в NHibernate).Пользователь / роль, настроенные в базе данных, были менее чем оптимальными, поэтому я переписываю их, так как часть проекта все равно добавляла новые функции.Однако перевод в NHibernate работает неправильно.Вот соответствующие части моей установки:
База данных: 3 таблицы;USERS, ROLES и USERS_XREF_ROLES (которые являются таблицей соединений / мостов)
User.hbm.xml:
<set name="Roles" table="[USERS_XREF_ROLES]" lazy="false" order-by="[FK_ROLES] asc" cascade="all">
<key column="[FK_USERS]" />
<many-to-many class="UserRole" column="[FK_ROLES]" />
</set>
UserRole.hbm.xml:
<set name="Users" inverse="true" table="[USERS_XREF_ROLES]" lazy="false" >
<key column="[FK_ROLES]" />
<many-to-many class="User" column="[FK_USERS]" />
</set>
Также обратите внимание, что изначально в классе UserRole не было набора «Users»;Я добавил его из-за добавления таблицы «мост / соединение» и другого поста в SO, в котором упоминалось использование обратного набора для таблиц «мост / соединение».Все SELECTs работали нормально.Я прошел через нескольких пользователей и проверил разрешения, которые они должны иметьТем не менее, когда я пытался создать нового пользователя, он, очевидно, пытался вставить и в ROLES:
Ошибка: операция гибернации: не удалось вставить: [UserRole] [SQL: INSERT INTO [ROLES] ([ЦЕННОСТЬ]) ЦЕННОСТИ (?);выберите SCOPE_IDENTITY ()];некатегоризованное исключение данных для SQL [INSERT INTO [ROLES] ([VALUE]) VALUES (?);выберите SCOPE_IDENTITY ()];Код ошибки [];Невозможно вставить значение NULL в столбец 'NAME', таблица 'ROLES';столбец не допускает пустых значений.Вставить не удается.Заявление было прекращено.
Новый пользователь, очевидно, должен сгенерировать INSERT в USERS и USERS_XREF_ROLES, но НЕ в ROLES.Итак, что я здесь делаю неправильно?Спасибо.
ОБНОВЛЕНИЕ: Я пытаюсь прояснить свой вопрос.Моя большая проблема заключается в том, что все примеры, которые я когда-либо обнаруживал, показывают вставку ОБА связанных объектов в каждую соответствующую таблицу и в таблицу соединений.Я хочу иметь возможность добавить пользователя с существующей ролью.Я никогда не хочу вставки в таблицу ROLES при создании пользователя.Создание пользователя должно всегда вставлять одну запись в USERS и одну или несколько записей в USERS_XREF_ROLES, но НИКОГДА не в ROLES, потому что пользователь всегда будет назначен существующим ролям.Я надеюсь, что это понятнее.Мне еще предстоит найти пример, который показывает это, и это должно быть довольно распространенным делом.