这是我的情况..
假设您有以下模型实体,它们自己代表单个表:
电影 [Movie_Id,标题,评分,..]
演员 [Actor_Id,FirstName,LastName,..]
导演 [Director_Id,FirstName,LastName,..]
另一个名为“Recommendations”的实体/表,代表网站内用户之间的建议。该想法是推荐可以是任何类型,即推荐演员的人或推荐电影的人。基本上,表应该看起来像这样:
建议 [Recommendation_Id,Object_Id,Object_Type,..]
而这就是我所陷入的困境。如何在nHibernate中使用Fluent映射这些关系?
我的意思是..在映射时,我不能指定Type(与哪个表相关)'因为它是在运行时确定的,但是我不能仅仅依赖于Id'因为它本身并不意味着它属于哪个表。
例如,想象一下建议表上的这条记录:
Recommendation_Id - OBJECT_ID - OBJECT_TYPE
83001--4010123 --- “M”
基本上我存储一个字符标识符(在这种情况下“M”代表表“电影”)以知道Object_Id属于哪个表。我不能在没有Object_Type的情况下存储Object_Id。
作为最后的评论,我想补充一点,我已经看过所有每个类的表,每个子类的表,每个具体的表类示例,但我相信这些都不适合这个由于Movies_Id,Actors_Id,Directors_Id,......之间的情况各不相同,所以Recommendations_Id也是如此。我的意思是,这里没有基类 - 子类继承,它们根本不共享Id ..
我希望我能说清楚。 提前谢谢。
答案 0 :(得分:13)
您正在寻找的NHibernate映射是<any/>
。以下是一些可帮助您快速掌握此NHibernate映射功能的资源:
我相信你拍摄的* .hbm.xml是这样的:
<class name="Recommendation" table="Recommendations">
<id name="Id">
<column name="Recommendation_Id" />
<generator class="native"/>
</id>
<any name="RecommendedObject" id-type="System.Int32" meta-type="System.String">
<meta-value value="M" class="Movie"/>
<meta-value value="A" class="Actor"/>
<meta-value value="D" class="Director"/>
<column name="Object_Type"/>
<column name="Object_Id"/>
</any>
<!-- other stuff ... -->
</class>
你应该能够像Fluent NHibernate那样在推荐的映射中实现这一点:
ReferencesAny(x => x.RecommendedObject)
.IdentityType<int>()
.EntityTypeColumn("Object_Type")
.EntityIdentifierColumn("Object_Id")
.AddMetaValue<Movie>("M")
.AddMetaValue<Actor>("A")
.AddMetaValue<Director>("D");