2010-06-28 18 views
0

試圖實現UserRole之間相對簡單的關係。 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,並且第三個是用於許多對多關係(有兩個外鍵:UserIdRoleId)。主鍵是這兩個鍵的組合鍵。

的問題場景:角色是預定義的。在我的C#代碼,我構建用戶,而附加的作用它。該角色是一個成功從DB獲取的對象,具有正確的ID。我正試圖將用戶保存在數據庫中。

我們的問題:我收到一個重複鍵 DB錯誤,因爲NHibernate的試圖插入Role對象插入到相應的表。由於RoleId已經屬於現有的角色,我預計在數據庫中不會插入新角色。

血淋淋的細節:我也試着調試NHibernate和看到的,由於某種原因EntityIdentityInsertAction收到Role並調用基類的構造。在對基礎構造函數的調用中,Id參數是簡單的硬編碼null。堆棧跟蹤還包含對SaveWithGeneratedId()(鏈中較早的某個地方)的調用,這意味着由於某種原因,現有的Role對象的Id不計入。

這是我已經成功迄今發現的信息。請告訴我做錯了什麼。

回答

1

我的第一個直覺反應是你不想在用戶的Roles集合上使用cascade =「save-update」。

如果您希望對保存用戶時保存/更新的實際角色所做的更改進行設置,您只需要這樣做。

我假設你打算後,確保關係撲救,但出現這種情況不論你級聯設置。