試圖實現User
和Role
之間相對簡單的關係。 User
可以有多種角色,相同的Role
可以屬於任何數量的User
s。 Role
s的共享,即,所有管理員User
s請參閱Role
類的非常相同的實例。另一個多到很多NHibernate的問題
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
S,一個用於Role
s,並且第三個是用於許多對多關係(有兩個外鍵:UserId
和RoleId
)。主鍵是這兩個鍵的組合鍵。
的問題場景:角色是預定義的。在我的C#代碼,我構建用戶,而附加的作用它。該角色是一個成功從DB獲取的對象,具有正確的ID。我正試圖將用戶保存在數據庫中。
我們的問題:我收到一個重複鍵 DB錯誤,因爲NHibernate的試圖插入Role
對象插入到相應的表。由於RoleId
已經屬於現有的角色,我預計在數據庫中不會插入新角色。
血淋淋的細節:我也試着調試NHibernate和看到的,由於某種原因EntityIdentityInsertAction
收到Role
並調用基類的構造。在對基礎構造函數的調用中,Id
參數是簡單的硬編碼null。堆棧跟蹤還包含對SaveWithGeneratedId()
(鏈中較早的某個地方)的調用,這意味着由於某種原因,現有的Role
對象的Id
不計入。
這是我已經成功迄今發現的信息。請告訴我做錯了什麼。