nHibernate добавление новых элементов для отношений многие ко многим - PullRequest
1 голос
/ 09 мая 2011

У меня есть три сущности в моей музыкальной БД: Видео , Альбом и Жанр . И видео, и альбомы могут иметь несколько жанров, поэтому я связываю их с ассоциацией многие-ко-многим через общую таблицу. Вот что у меня в БД:

Videos: Id (int)
Albums: Id (int)
Genre:  Id (int)

Item_Genres: (table for many-to-many mapping)
   Id (int)
   objectType (here I have "album" for albums and "video" for videos)
   objectId (id from either Albums or Videos table)
   genreId (Id of the appropriate genre)

У меня проблема с добавлением нового Жанра к моему Видео . Когда я делаю

videos.Genres.Add(genre);

nHibernate создает строку в таблице Item_Genres с правами genreId и objectId , но с пустым objectType . Как я могу это исправить?

Вот мое отображение для Видео Класс:

<set name="Genres" table="item_genres" lazy="true" where="objectType = 'video'">
    <key>
        <column name="objectId" not-null="true"/>
    </key>
    <many-to-many class="Repositories.Entities.Genre">
        <column name="genreId" not-null="true"/>
    </many-to-many>
</set> 

С его помощью я могу без проблем запросить Жанры для Видео с БД, проблема только с добавлением нового.

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Такие отношения не должны отображаться как многие ко многим. Истинные многие ко многим должны содержать только objectId и genreId в вашем случае. Вы должны отобразить это отношение как один-ко-многим с обеих сторон и создать фактическую сущность с именем ItemGenre, которая представляет вашу таблицу item_genres. Также обратите внимание, что это изменит ваши карты классов для использования HasMany вместо ManyToMany. Это устранит необходимость в вашей пользовательской вставке.

1 голос
/ 09 мая 2011

Похоже, что единственный случай - использование пользовательской вставки sql.

<set name="Genres" table="item_genres" lazy="true" where="objectType = 'video'">
    <many-to-many class="Repositories.Entities.Genre">
        <column name="genreId" not-null="true"/>
    </many-to-many>
    <sql-insert>INSERT INTO item_genres (objectId, genreId, type) VALUES ( ?, ?, 'video' )</sql-insert>
</set> 

Это сработало для меня. К сожалению, Fluent NHibernate не поддерживает это: (

...