这是我的情况..
假设您有以下模型实体,它们各自代表单个表:
Movies[ 电影 ID、标题、评级、..]
Actors[演员 ID、名字、姓氏、..]
Director[ 导演 ID、名字、姓氏、..]
另一个实体/表称为“推荐”,它代表网站内用户之间的推荐。这个想法是推荐可以是任何类型,即有人推荐演员,或者有人推荐电影。基本上,该表应该如下所示:
建议[推荐_Id、对象_Id、对象_类型、..]
这就是我所陷入的困境。如何使用 Fluent 在 nHibernate 中映射这些关系?
我的意思是..在映射时,我无法指定类型(与哪个表相关),因为这是在运行时确定的,但我不能仅依赖于 Id ,因为它本身不能暗示属于哪个表。
例如,想象一下推荐表上的这条记录:
推荐_Id--对象_Id--对象_类型
83001--4010123---“M”
基本上,我存储一个字符标识符(在本例中“M”代表表“电影”)来了解 Object_Id 属于哪个表。我不能只存储 Object_Id 而不存储 Object_Type..
作为最后的评论,我想补充一点,我已经看到了所有每个类表、每个子类表、每个具体类表的示例,但我相信这些都不适合这种情况,因为Movies_Id、Actors_Id、Directors_Id...之间都不同,Recommendations_Id 也是如此。我的意思是,这里没有基类-子类继承,它们根本不共享 Id。
我希望我能说清楚。
提前致谢。
您正在寻找的 NHibernate 映射是<any/>
。以下是一些资源,可帮助您快速了解 NHibernate 映射功能:
- 阿延德的博客文章
- NHibernate 文档
- 流畅的 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");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)