2009-11-01 141 views
0

我的應用程序是一個多用戶的podcast聚合器,使用NHibernate 2.1(如果這改變了.NET 4.0的話)。我也是一個完整的NHibernate n00b。每個播客的NHibernate中的多對多集合映射

詳細信息只存儲一次,並且用戶訂閱的播客,所以播客和用戶之間的許多一對多的映射,我已經在我的數據庫與訂閱表映射:

Subscriptions(UserId, FeedId) 

我也有存儲每個用戶每個項目的信息UserFeedItems表:

UserFeedItems(UserId, FeedItemId, IsNew, ListenCount, etc.) 

我的對象模型是有點不同:

class Podcast { 
    IList<PodcastFeedItem> FeedItems { get; set; } 
    bool HasNew { 
     get { 
      // return true if any of the FeedItems are new 
     } 
    } 
} 

class PodcastFeedItem { 
    bool IsNew { get; set; } 
} 

class User { 
    IList<PodcastFeed> Subscriptions { get; set; } 
} 

在NHibernate中需要什麼映射來將關係模型正確映射到對象模型?通過定義上面列出的那些「鏈接」表,我是否已經走到了盡頭?排序可能很重要,因爲顯然我需要按照時間順序組織飼料。

我已閱讀the documentation on collection mapping,但我很努力地將這些示例應用到我自己的場景中。

回答

1

它是傳統的多對多模式,其中Podcast可以有很多訂閱者,並且訂閱者可以訂閱許多播客。你喜歡這個映射它:

<class name="App.Core.Domain.User, App.Core" table="users"> 
    <set name="SubscribedPodcasts" table="subscriptions" inverse="false" cascade="all"> 
     <key column="userid"/> 
     <many-to-many class="App.Core.Domain.Podcasts, App.Core" column="podcastid"/> 
    </set> 
</class> 


<class name="App.Core.Domain.Podcast, App.Core" table="podcasts"> 
    <set name="SubscribedUsers" table="subscriptions" inverse="false" cascade="all"> 
     <key column="podcastid"/> 
     <many-to-many class="App.Core.Domain.User, App.Core" column="userid"/> 
    </set> 
</class> 

如果你真的要存儲在數據庫中的索引,而不是NH結果排序(我從來沒有這樣做,因爲它更好地列訂購和有NH提供你的索引)。然後加入

<index-many-to-many 
     column="column_name"     
     class="ClassName"     
/> 

要映射

+0

感謝您提供更詳細的答案;不幸的是,我還在等待一段時間來測試這一點。 – alastairs 2009-11-11 15:12:38

+0

有幾個問題: 1.爲什麼套在袋子上? 2.類名是否應該在多對多標籤中相同?沒有一個播客,一個用戶? (如果是這樣的話,我不確定它應該是哪條路)。 – alastairs 2009-11-11 22:08:11

+0

在上面的映射中有一個錯誤,第二個多對多應該是類用戶 - 對不起,我會更新答案。 – reach4thelasers 2009-11-12 14:47:18

1

你不需要查找表。 this question的答案提供了有關如何在NHibernate中執行多對多的詳細信息。

+0

謝謝您的回答。你鏈接到的答案意味着我不需要爲我的查找表(我沒有,也不期望需要)提供一個類。但是,另一個答案(來自OP)中的示例映射仍使用查找表。是對的嗎? – alastairs 2009-11-02 00:22:57

+0

正確,您不需要定義類,但仍需要通過數據庫中的表映射關係 – lomaxx 2009-11-02 02:32:48