2011-09-03 42 views
0

我已經繼承了一個Spring + NHibernate的c#應用程序,我們正在進行一次大規模的徹底檢查(而且我對NHibernate相當新穎)。在數據庫中設置的用戶/角色不是最佳的,所以我正在重寫它,因爲無論如何,該項目的一部分都是添加新功能。但是,NHibernate的翻譯工作不正常。這裏是我的設置的相關部分:休眠多對多映射在插入時無法正常工作

數據庫: 3桌;用戶,角色和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> 

還要注意,有WASN」 t最初是UserRole類中的一組「用戶」;我已經添加了它,因爲添加了橋/連接表和SO上的另一篇文章,其中提到使用橋/連接表的反向集。所有的SELECT都工作正常。我經歷了多個用戶並測試了他們應該擁有的權限。但是,當我試圖創建一個新用戶時,顯然也試圖插入到ROLES中:

錯誤:Hibernate操作:無法插入:[UserRole] [SQL:INSERT INTO [ROLES]([VALUE] )VALUES(?);選擇SCOPE_IDENTITY()];未分類DataException for SQL [INSERT INTO [ROLES]([VALUE])VALUES(?);選擇SCOPE_IDENTITY()];錯誤代碼 [];無法將NULL值插入'NAME'列'ROLES'列;列不允許有空值。 INSERT失敗。該語句已終止。

新用戶顯然應該在USERS和USERS_XREF_ROLES中生成一個INSERT,但不是ROLES。那麼,我在這裏做錯了什麼?謝謝。

更新:我試圖讓我的問題更清晰。我最大的問題是,我發現的所有示例都顯示將相關對象的BOTH插入到每個相應的表中和連接表中。我希望能夠添加具有現有角色的用戶。創建用戶時,我不希望在ROLES表中出現插入。創建用戶應該總是將一條記錄插入到USERS中,並將一條或多條記錄插入到USERS_XREF_ROLES中,但不要將其插入到ROLES中,因爲用戶將始終被分配到現有角色。我希望這更清楚。我還沒有找到一個能夠證明這一點的例子,這一定是一件很常見的事情。

回答

0

A new user should obviously generate an INSERT into USERS and USERS_XREF_ROLES, but NOT ROLES. So, what am I doing incorrectly here? Thanks.

這種說法混淆了我,我可能只是誤會,但如果USERS_XREF_ROLES是橋臺那麼爲什麼一個INSERT到USERS必要插入到表橋?用戶可能存在沒有分配的角色嗎?考慮到這一點,我認爲問題不在於nHibernate映射,而在於你的c#對象被實例化的方式。也許一個未綁定的Role類是通過User類的實例創建的?

+0

你是對的 - USERS表中沒有對應記錄的記錄可以存在於USERS_XREF_ROLES表中。但是,業務要求是所有用戶必須分配至少一個角色。我的假設是NHibernate處理所有插入邏輯,並且它都可以通過XML進行配置。我沒有橋表的類(這是正確的處理?),那麼如何確保將記錄插入到USERS和USERS_XREF_ROLES中?我認爲這真的是我在這裏不理解的。 – heath

+0

我不知道這樣的需求可以由nHibernate強制執行,因爲它必須知道某個默認角色才能分配給用戶。我的建議是,您的數據模型會在您的C#代碼中執行任何此類要求。數據庫觸發器也可以工作,但我對此有個人偏好。 –

+0

是的,沒有db觸發我,無論。那麼,你所說的是,如果我按照我設置的方式聲明cascade =「all」,它會嘗試在所有3個表中插入一條記錄?這似乎是一個非常普遍的情況,這讓我覺得應該有一個非常普遍的,直接的解決方案。但是,我真的沒有通過谷歌找到很多。由於我正在改寫這個,所以我很樂意接受不同的解決方案。 – heath