NHibernate将多个表映射到一个类

时间:2013-11-08 16:14:57

标签: c# nhibernate nhibernate-mapping

在我的旧数据库中,我遇到这样的情况:

TableA (id_A[PK], cod_A)
TableB (id_B[PK], cod_B, id_A[FK])
TableC (id_C[PK], cod_C, id_B[FK])

由于多种原因,我需要将这些表映射到一个类(本例中为Foo)

public class Foo
{
    public virtual string IdA { get; set; }
    public virtual string CodA { get; set; }

    public virtual string IdB { get; set; }
    public virtual string CodB { get; set; }

    public virtual string IdC { get; set; }
    public virtual string CodC { get; set; }    
}

通过以下映射,我能够连接Table1和Table2,但不能连接Table3

<class name="Foo" table="TableA">

    <id name="IdA" column="id_A"/>
    <property name="CodA" column="cod_A"/> 

    <join table="TableB">
      <key column="id_A"/>
      <property name="IdB" column="id_B"/>
      <property name="CodB" column="cod_B"/>      
    </join>

    <!--Here my problem because off course the join will be on TableA instead on TableB-->
    <join table="TableC">
      <key column="id_B"/>
      <property name="IdC" column="id_C"/>
      <property name="CodC" column="cod_C"/>      
    </join>

  </class>

如何映射Table3?

提前致谢。

2 个答案:

答案 0 :(得分:1)

NHibernate不鼓励你尽可能多地使用join。但有时候没有办法绕过它。

如果可以的话,解决问题的第一种也是最简单的方法是创建一个视图并将您的类映射到视图。

第二种方法是为每个其他表创建一个对象,并以正确的方式连接它们,可能是 - <one-to-one>映射。

第三种方式

*警告 - 请自担风险*

下载NH源代码 - https://github.com/Nicaog/nhibernate-core/downloads

下载以下错误修补程序说明 - https://nhibernate.jira.com/browse/NH-1681

更改代码,编译DLL并将其添加到解决方案中。

说明 - 使用property-ref进行<join>映射的修补程序。 ,但也使用property-ref多次加入。

答案 1 :(得分:0)

<id name="IdA" column="id_A"/>
<property name="CodA" column="cod_A"/> 

<join table="TableB">
  <key column="id_A"/>
  <property name="IdB" column="id_B"/>
  <property name="CodB" column="cod_B"/>   

  <join table="TableC">
  <key column="id_B"/>
  <property name="IdC" column="id_C"/>
  <property name="CodC" column="cod_C"/>      
  </join>
</join>

你能做到吗?