我的应用程序是一个多用户播客聚合器,使用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,但我正在努力使这些示例符合我自己的情况。
答案 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"
/>
到映射