多次映射列

时间:2011-02-23 18:42:53

标签: nhibernate fluent-nhibernate

我的流利hibernate地图中有一个相当奇怪的要求。我有一个表(A),它与另一个表(B)有复合外键关系。在表A的映射中,我希望从表B创建对象并访问定义密钥的A的各个属性。有没有办法做到这一点?如果我将列映射两次,我似乎会将索引超出范围异常。

我不能只考虑B的属性,因为表B中的行可能不存在。我痛苦地意识到我正在处理的结构中有一些重要的气味。这就是那些处理遗留系统的人的命运。

1 个答案:

答案 0 :(得分:1)

通过黑客攻击,有点可能。

我们将定义一个带有假集合的域,我们将用它来检索单个相关元素,如果找到的话:

public class Foo
{
    public virtual BarKey BarKey { get; set; }
    public virtual Bar Bar { get { return Bars.SingleOrDefault(); } }
    protected virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
    public virtual BarKey Id { get; set; }
}

//this class must override Equals and GetHashcode. Implementation not shown.
public class BarKey
{
    public virtual int X { get; set; }
    public virtual int Y { get; set; }
}

BarKey组件包含属于密钥的属性。

现在,映射:

<class name="Foo">
  <id ...><generator .../></id>
  <component name="BarKey">
    <property name="X" />
    <property name="Y" />
  </component>
  <bag name="Bars" inverse="true">
    <key property-ref="BarKey">
      <column name="X"/>
      <column name="Y"/>
    </key>
    <one-to-many class="Bar"/>
  </bag>
</class>
<class name="Bar">
  <composite-id name="Id">
    <key-property name="X" />
    <key-property name="Y" />
  </composite-id>
</class>

property-ref属性告诉NH将Bar中的这些列与Foo的BarKey属性相匹配,而不是其ID。