2013-01-21 71 views
1

我有很多對用戶和調查之間一對多的關係,這種關係是雙向的,因此對於users一個列表中添加一項新的調查時,我需要這樣做:多對多單向

foreach(User user in users) 
{ 
    survey.Users.Add(user); 
    user.Survey.Add(survey); 
} 

遍歷所有的用戶看起來有點矯枉過正,因爲可以有很多用戶。

沒有更好的方法嗎? 是否有可能具有單向多對多?

回答

1

啊,你的問題是你的數據庫設計。如果他們不分解,多對多的關係會導致你像這樣的主要頭痛:)。

解決方案:創建一個新的表名爲UserSurvey,具有主鍵,然後UserID場和SurveyID場,像這樣:

---------------------------------------- 
| UserSurveyID | PrimaryKey   | 
| UserID  | Foreign Key to User | 
| SurveyID  | Foreign key to Survey | 
---------------------------------------- 

然後,所有你需要做的就是查詢該表你需要什麼。

我也是會做的是也許在NHibernate的UserSurvey類,把實際User屬性和Survey財產,一旦你有你的UserSurvey對象爲您節省更多的查詢。

+0

你的描述就是默認HasManyToMany映射創建。我不確定我是否理解你的答案... –

+0

@OPCoder我對流利不太熟悉**,但我相信這個問題的最佳答案可以達到http://stackoverflow.com/questions/707708/ Fluent-nhibernate-how-to-map-the-foreign-key-column-as-a-property – mattytommo

+0

感謝您的回答,但它對我無能爲力。我不知道如何以你描述的方式實現多對多。 –

0

是的,你可以有一個單向的多對多。沒有什麼特別的,你需要做到這一點,只是不映射關係的另一方。

如果您需要維護關係的內存中表示形式,那麼您需要像在做的那樣添加對關係兩端的引用。這並不過分,你必須將一組用戶與一項調查聯繫起來,所以在某些時候你必須循環訪問一組用戶並進行關聯。

如果你想避免加載調查的用戶集合,可以檢查集合訪問它之前進行初始化:

foreach(User user in users) 
{ 
    user.Survey.Add(survey); 
    if (NHibernateUtil.IsInitialized(survey.Users) 
    { 
     survey.Users.Add(user); 
    } 
} 
+0

你確定沒有任何問題只映射一方?我會盡快測試 –

+0

我確定我'我已經在我的代碼中成功完成了它,但我不能保證它可以爲你工作。爲了查詢,我幾乎總是映射雙方。 –