NHibernate映射 - 引用同一个表的两个字段

时间:2014-07-02 19:50:34

标签: nhibernate nhibernate-mapping

我有一个表ExchangeRate,它有以下4个字段和关系

  • ID - 唯一ID,
  • CurrencyFrom - 外币到货币表,
  • CurrencyTo - 外币到货币表。
  • ExchangeRate - double

我创建了一个如下所示的映射文件

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernateService" assembly="NHibernateService">
  <class name="Entity" table="ExchangeRate" entity-name="ExchangeRate">
    <id name="id" column="id">
      <generator class="native" />
    </id>
    <dynamic-component name="Attributes">
      <property name="ExchangeRate" column="ExchangeRate" type="double" />
      <many-to-one name="Currency" class="Entity" entity-name="Currency" column="CurrencyFrom" lazy="false" />
      <many-to-one name="Currency" class="Entity" entity-name="Currency" column="CurrencyTo" lazy="false" />
    </dynamic-component>
  </class>
</hibernate-mapping>

它会抛出一个错误,因为它有两个字段在同一个表中。 此方案的映射文件中需要进行哪些更改? 在此先感谢。

1 个答案:

答案 0 :(得分:0)

问题出在name元素的 many-to-one 属性中。简单地说,不能有两个相同的名字。它与C#中的相同,不会编译:

public class Entity
{
    public virtual int      id           { get; set; }
    public virtual Currency Currency     { get; set; }
    public virtual Currency Currency     { get; set; } // the same name twice
    public virtual double   ExchangeRate { get; set; }
}

上面的映射是1:1来提供问题中的xml映射。两个属性的名称是相同的货币 ...我们必须像这样更改(在C#中)

public class Entity
{
    public virtual int      id           { get; set; }
    public virtual Currency CurrencyFrom { get; set; }
    public virtual Currency CurrencyTo   { get; set; } // different names
    public virtual double   ExchangeRate { get; set; }
}

并且必须将相同的(如上面讨论的C#实体级别)应用于映射。此外,class属性必须表示其属性类型(即货币)

<many-to-one name="CurrencyFrom" class="Currency" column="CurrencyFrom" lazy="false" />
<many-to-one name="CurrencyTo"   class="Currency" column="CurrencyTo"   lazy="false" />

注意:所有人都希望,类似的方式将表 [Currency] 映射到Currency