NHibernate多对多关系问题:可以选择,无法更新

时间:2010-07-15 12:15:41

标签: c# nhibernate orm nhibernate-mapping many-to-many

每个用户都有一个角色列表:

  <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语句(这是Ok)。问题是当我尝试更新现有用户(具有角色)时:我只看到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:这就是表格的定义方式:

Role表:

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);

User表:

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);

User_Role relatioin table(外键):

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 个答案:

答案 0 :(得分:1)

我自己遇到了类似的问题。

尝试删除User集合和Role集合上的inverse="true",看看是否有任何区别。这对我有用。

对于多对多关系和inverse属性,似乎存在一些意外行为。也许其他人可以解释为什么这比我发生得更好。 :)

更新:如果我没有弄错,你需要在角色映射下映射多对多包。 尽量保留inverse="false"或完全没有inverse属性。
您确定那里使用的foreign-key值吗?

另外,我认为在映射class属性时,您需要提供完全限定的名称,即:Namespace.Class, Assembly

除此之外,它看起来大多像我自己的映射文件。

答案 1 :(得分:0)

<bag name="RoleList" table="User_Role" cascade="save-update">
  <key column="UserId"/>
  <many-to-many class="Role" column="RoleId"/>
</bag>

另外:lazy="false"几乎总是一个坏主意。