使用Fluent nHibernate映射到多个表

使用Fluent nHibernate映射到多个表,nhibernate,fluent-nhibernate,mapping,Nhibernate,Fluent Nhibernate,Mapping,这是我的情况。 假设您有以下模型实体,它们各自表示单个表: 电影[电影Id、片名、分级,…] 演员[Actor_Id,FirstName,LastName,…] 董事[董事Id、名字、姓氏,…] 和另一个名为“推荐”的实体/表格,代表网站内用户之间的推荐。其理念是,推荐可以是任何类型,即有人推荐演员,或有人推荐电影。基本上,该表应该如下所示: 建议[建议Id、对象Id、对象类型,…] 这就是我陷入的困境。如何使用Fluent映射nHibernate中的这些关系? 我是说。。映射时,我不能

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

电影[电影Id、片名、分级,…]
演员[Actor_Id,FirstName,LastName,…]
董事[董事Id、名字、姓氏,…]

和另一个名为“推荐”的实体/表格,代表网站内用户之间的推荐。其理念是,推荐可以是任何类型,即有人推荐演员,或有人推荐电影。基本上,该表应该如下所示:

建议[建议Id、对象Id、对象类型,…]

这就是我陷入的困境。如何使用Fluent映射nHibernate中的这些关系? 我是说。。映射时,我不能指定运行时确定的“原因”类型(与哪个表相关),但我不能仅依赖于Id,因为它本身不能暗示它属于哪个表。
例如,想象一下建议表上的记录:

推荐标识--对象标识--对象类型
83001--4010123--“M”

基本上,我存储了一个字符标识符(在本例中“m”代表表“Movies”),以了解表对象_Id属于哪个表。如果没有对象类型,我不能只存储对象Id。

作为最后的评论,我想补充一点,我已经看到了所有每个类的表、每个子类的表、每个具体类的表的例子,但我相信这些都不适合这种情况,比如电影Id、演员Id、导演Id等等。。。它们之间都是不同的,推荐Id也是不同的。我的意思是,这里没有基类子类继承,它们根本不共享Id

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

您正在寻找的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");
    
    ReferencesAny(x=>x.RecommendeObject)
    .IdentityType()
    .EntityTypeColumn(“对象类型”)
    .EntityIdentifierColumn(“对象Id”)
    .AddMetaValue(“M”)
    .AddMetaValue(“A”)
    .AddMetaValue(“D”);
    
    非常感谢!!!!我已经测试过了,似乎效果不错。说真的,非常感谢丹尼尔!:=)请举例说明如何通过
    object\u Id
    进行过滤来查询
    对象推荐对象
    ?@Christian,你指的是什么?应该注意的是,fluent nHibernate目前不支持多对多,这正是我所认为的。除非我错了,否则在更新电影时保存推荐不会无缝进行。丹尼尔的回答几乎是我能找到的任何其他答案;o) 如果您想映射
    任何
    关系的另一面,如在
    电影推荐
    中,我相信您可以使用集合上的
    一对多
    where=“Object_Type='M'”
    属性来实现这一点,您可以使用Fluent NHibernate来实现。