nHibernate为多对多关系添加新项目

时间:2011-05-09 16:54:24

标签: nhibernate fluent-nhibernate many-to-many

我的音乐相关数据库中有三个实体:视频相册流派。视频和专辑都可以有多种类型,因此我通过公共表将它们与多对多关联链接起来。 这就是我在DB中所拥有的:

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 。我该如何解决这个问题?

这是 Video 类的映射:

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

有了它,我可以从DB请求 Genres 获取视频而没有任何问题,问题只在于添加新内容。

2 个答案:

答案 0 :(得分:1)

似乎唯一的情况是使用自定义sql-insert。

<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不支持这个:(

答案 1 :(得分:1)

这样的关系实际上不应该被映射为多对多。在您的情况下,真正的多对多应该只包含objectId和genreId。您应该将此关系映射为两侧的一对多,并创建一个名为ItemGenre的实际实体,该实体代表您的item_genres表。另请注意,这会将您的类映射更改为使用HasMany而不是ManyToMany。这将消除您对自定义插入的需求。