使用Fluent nHibernate映射到多个表

时间:2012-01-24 15:20:04

标签: nhibernate fluent-nhibernate mapping

这是我的情况..
假设您有以下模型实体,它们自己代表单个表:

电影 [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 ..

我希望我能说清楚。 提前谢谢。

1 个答案:

答案 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");