我的音乐相关数据库中有三个实体:视频,相册和流派。视频和专辑都可以有多种类型,因此我通过公共表将它们与多对多关联链接起来。 这就是我在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 获取视频而没有任何问题,问题只在于添加新内容。
答案 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。这将消除您对自定义插入的需求。