Отображение коллекции «многие ко многим» в NHibernate - PullRequest
0 голосов
/ 02 ноября 2009

Мое приложение - многопользовательский агрегатор подкастов, использующий 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 для правильного сопоставления реляционной модели с объектной моделью? Разве я зашел слишком далеко, определив перечисленные выше таблицы «ссылок»? Здесь может быть важно упорядочение, так как, очевидно, мне нужно, чтобы каналы были организованы в порядке убывания.

Я прочитал документацию по сопоставлению коллекций , но я изо всех сил стараюсь привести примеры к моему собственному сценарию.

Ответы [ 2 ]

1 голос
/ 05 ноября 2009

Классический вариант «многие ко многим», где у подкаста может быть много подписчиков, а подписчик может подписаться на множество подкастов. Вы отображаете это так:

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

К отображению

1 голос
/ 02 ноября 2009

Вам не нужна таблица поиска. Ответ на на этот вопрос содержит подробности о том, как выполнить многие ко многим в NHibernate

...