NHibernate вопрос многие-ко-многим: могу выбрать, не могу обновить - PullRequest
1 голос
/ 15 июля 2010

У каждого пользователя есть список ролей:

  <class name="User" lazy="false" table="Users">
    <id name="Id" type="int">
      <generator class="native"/>
    </id>

    <property name="Name" />

    <bag name="RoleList" table="User_Role" inverse="true" lazy="false" collection-type="Roles">
      <key column="UserId" foreign-key="Id"/>
      <many-to-many class="Role" column="RoleId"/>
    </bag>

  </class>

Я отслеживаю все запросы к серверу SQL.Когда я выбираю пользователя, я также вижу оператор SQL SELECT (что нормально).Проблема заключается в том, что я пытаюсь обновить существующего пользователя (у которого есть роли): я вижу только обновление до User таблицы, но не до User_Role (что плохо).

Чтобы уточнить: я не ожидаю вставки / обновления в таблице Role (но в User_Role, поскольку роли являются "постоянными" и могут быть присоединены и отсоединены свободно.

Почему выберите работает правильно, но не обновите . пожалуйста? Если вам нужна дополнительная информация - просто спросите - я постараюсь ответить на все второстепенные вопросы.

Обновление: отображение Role:

  <class name="Role" lazy="false" table="Roles">
    <id name="Id" type="int">
      <generator class="native"/>
    </id>

    <property name="Name" />
    <property name="Description" />
  </class>

Обновление N2: Вот как определяются таблицы:

<strong>Role</strong> таблица:

CREATE TABLE [Roles] (
[Id] INTEGER NOT NULL PRIMARY KEY,
[Name] text  NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0)
);

CREATE UNIQUE INDEX uidxUserName ON Roles (Name COLLATE NOCASE);

<strong>User</strong> таблица:

CREATE TABLE [Users] (
[Id] INTEGER NOT NULL PRIMARY KEY,
[Name] text NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0)
);

CREATE UNIQUE INDEX uidxRoleName ON Users (Name COLLATE NOCASE);

<strong>User_Role</strong> таблица соотношений (внешние ключи):

CREATE TABLE [User_Role] (
[UserId] INTEGER NOT NULL,
[RoleId] INTEGER NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0),
PRIMARY KEY (UserId, RoleId),
FOREIGN KEY (UserId) REFERENCES Users(Id),
FOREIGN KEY (RoleId) REFERENCES Roles(Id)
);

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Я сам столкнулся с подобной проблемой.

Попробуйте удалить inverse="true" как в коллекции User, так и в коллекции Role и посмотрите, есть ли какая-либо разница.Это сработало для меня.

Кажется неожиданным поведение с отношениями "многие ко многим" и атрибутом inverse.Возможно, кто-то еще может объяснить, почему это происходит лучше, чем я.:)

Обновление: Если я здесь не ошибаюсь, вам нужно сопоставить сумку "многие ко многим" в соответствии с отображением ролей. Попытайтесь сохранить оба атрибута inverse="false" или вообще без атрибута inverse.
Вы уверены в том, что значение foreign-key используется там?Для атрибута class вам необходимо указать полное имя, например: Namespace.Class, Assembly.

Кроме того, оно выглядит в основном как мои собственные файлы сопоставления.

0 голосов
/ 16 июля 2010
<bag name="RoleList" table="User_Role" cascade="save-update">
  <key column="UserId"/>
  <many-to-many class="Role" column="RoleId"/>
</bag>

Также: lazy="false" почти всегда плохая идея.

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