使用 NHibernate 进行类映射

本文关键字:映射 NHibernate 使用 | 更新日期: 2023-09-27 18:32:48

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

| PropertyA | PropertyB| PropertyC | PropertyD | PropertyE |
属性

A、属性 B 和属性 C 是密钥的一部分。

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

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>
....

有人知道我如何定义属性 A 和属性 B 的键属性吗?

提前感谢您的帮助

使用 NHibernate 进行类映射

可能是一个坏主意,但您可以尝试生成一个装饰SubFoo类的FooIdentifier类,以提供对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>

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

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

但我强烈建议不要使用组合键,因为通常可能会出现一些问题。此外,建议在每个表中或多或少地有一个代理键,并在需要时使用辅助键/外键。

这也使 nhibernate 映射变得容易得多!