0

我有一个普通的数据库表(名为 DBFoo):

| PropertyA | PropertyB| PropertyC | PropertyD | PropertyE |

PropertyA、PropertyB 和 PropertyC 是键的一部分。

为此,在我的程序中,我有以下类结构:

public class Foo
{
   public virtual SubFoo SubFoo { get; set; }
   public virtual string PropertyC { get; set; }
   public virtual string PropertyD { get; set; }
   public virtual string PropertyE { get; set; }
}

public class SubFoo
{
   public virtual string PropertyA { get; set; }
   public virtual string PropertyB { get; set; }
}

现在我正在尝试创建映射文件:

...
<class name="Foo" table="DBFoo">
   <composite-id>
      // here I Need to define the mapping for the SubFoo properties PropertyA and PropertyB
      <key-property name="PropertyC" column="PropertyC"/>
   </composite-id>
   <property name="PropertyD" column="PropertyD"/>
   <property name="PropertyE" column="PropertyE"/>
</class>
....

任何人都知道如何定义 PropertyA 和 PropertyB 的键属性?

提前感谢您的帮助

4

2 回答 2

0

可能是个坏主意,但您可以尝试生成一个FooIdentifier类来装饰您的类以提供对和的SubFoo直接访问。PropertyAPropertyBPropertyC

public class FooIdentifier
{
    private SubFoo InnerSubFoo { get; set; }
    public FooIdentifier(SubFoo subFoo, string propertyC)
    {
        this.InnerSubFoo = subFoo
        this.PropertyC = propertyC;
    }   

    public virtual string PropertyA 
    { 
        get 
        { 
            return SubFoo.PropertyA; 
        } 
        set 
        {
            SubFoo.PropertyA = value; 
        }
    }

    public virtual string PropertyB
    {
        get
        {
            return SubFoo.PropertyB; 
        }
        set 
        {
            SubFoo.PropertyB = value;
        }
    }

    public virtual string PropertyC { get; set; }
}

然后,映射文件可能类似于:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Foo" table="Foo" lazy="true" >
    <composite-id name="FooIdentifier" class="FooIdentifier">
      <key-property name="PropertyA" column="PropertyA" />
      <key-property name="PropertyB" column="PropertyB" />
      <key-property name="PropertyC" column="PropertyB" />
    </composite-id>
    <property name="PropertyD" column="PropertyD" type="String" />
    <property name="PropertyE" column="PropertyE" type="String" />
  </class>
</hibernate-mapping>
于 2013-09-26T08:16:12.850 回答
0

正如 HuorSwords 提到的,您可以为您的表定义一个复合键,为此,您必须创建一个包含属性并覆盖 hashkey 和 equals 方法的复合键类......

阅读此博客以了解有关应如何实施的更多详细信息。

但我强烈建议不要使用复合键,因为一般情况下可能存在一些问题。此外,建议在每个表中或多或少都有一个代理键,并在需要时使用辅助键/外键。

这也使得 nhibernate 映射更容易!

于 2013-09-28T17:19:26.523 回答