NHibernate中的多对多集合映射

时间:2009-11-01 23:34:45

标签: nhibernate nhibernate-mapping

我的应用程序是一个多用户播客聚合器,使用NHibernate 2.1(如果改变了任何东西,则使用.NET 4.0)。我也是一个完整的NHibernate n00b。

每个播客的详细信息仅存储一次,用户订阅了播客,因此播客和用户之间存在多对多映射,我已使用订阅表在我的数据库中映射:

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中需要哪些映射才能将关系模型正确映射到对象模型?我是否通过定义上面列出的“链接”表格走得很远?订购在这里可能很重要,因为显然我需要按照时间顺序降序排列Feed。

我已阅读the documentation on collection mapping,但我正在努力使这些示例符合我自己的情况。

2 个答案:

答案 0 :(得分:1)

您不需要查找表。 this question的答案提供了有关如何在NHibernate中执行多对多的详细信息

答案 1 :(得分:1)

它是一个经典的多对多,其中播客可以拥有许多订阅者,订阅者可以订阅许多播客。你这样映射:

<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"                   
/>

到映射