2012-03-15 47 views
0

好吧我在一個情況我有以下各表NHibernate的設計和組合鍵

用戶(用戶ID ....) UserFavourite(用戶ID,OtherUserId,ADDDATE)

如果你的「最愛「另一個用戶向userFavourite添加一行。現在,我在UserId和OtherUserId列和具有兩個外鍵約束的User表之間具有參照完整性。

我的問題是,通過NHibernate訪問它的最佳做法是什麼?基本的Get <>方法需要一個id,它是ID列。在這種情況下,表的唯一標識特性是UserId和OtherUserId的組合鍵,所以這導致我認爲我應該有一個組合鍵。我到處看到他們不好,如果數據庫設計正確,我不應該使用它們。

所以我想我還能怎麼設計數據庫,我想我可以有

UserFavourite(的UniqueID,用戶ID,OtherUserId,ADDDATE)

並作出唯一ID的PK和ID的獲取方法,並在UserId/OtherUserId列上放置一個唯一約束。然而,這並不能解決我的問題,因爲當我想通過代碼刪除該行或獲取它時,我仍然需要傳遞我無法訪問的UniqueID。我希望能夠說

「從您的收藏夾中刪除此用戶(用戶ID 142)」。所以我只能訪問UserId和你自己的UserId,所以我需要使用這兩個ID來運行NHibernate查詢,而不是唯一的ID。

有人可以指示我如何通過理想的做法在NHibernate中處理這種情況的方向,以便我可以輕鬆高效地執行這些查詢而不使用組合鍵嗎?

回答

0

對於純關係表,你可能已經對許多一對多映射(見NHibernate Many-to-many

考慮你們的關係表保存數據作爲ADDDATE(或許更晚),我覺得你應該去對於UniqueID,然後有集合映射

  • 兩個one-to-many與從User類到UserFavourite類的inverse =「true」。
  • 兩個many到一個從UserFavourite類用戶類

你可能永遠不會使用的唯一ID刪除UserFavourite。您只需在當前用戶的UserFavourites中篩選所需的UserFavourite,然後將其刪除。

也許你不會經常使用AddDate。我想用正確的映射屬性相對於更新(級聯,保存,更新,刪除),你可以結合這兩種方法(多對多+關係映射)。

+0

我對用戶類上的兩個一對多映射有點困惑,你可以發佈一個示例映射嗎?我不知道你們是如何聲明UserId屬性,並在該文件中有相同的屬性兩個單獨的映射。另外當你說我可能永遠不會使用UniqueId進行刪除時,我該如何刪除?我認爲使用會話對象刪除的唯一方法是使用ID? – NZJames 2012-03-16 09:57:59