使用NHibernate进行类映射

时间:2013-09-26 07:26:48

标签: c# nhibernate nhibernate-mapping

我有一个普通的数据库表(Named 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的关键属性?

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

可能是一个坏主意,但您可以尝试生成一个FooIdentifier类来装饰您的SubFoo课程,以便直接访问PropertyAPropertyB和{{ 1}}。

PropertyC

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

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; }
}

答案 1 :(得分:0)

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

请阅读this blog,详细了解如何实施此项目。

但我强烈建议不要使用复合键,因为通常会出现一些问题。此外,建议每个表中或多或少surrogate key,并在需要时使用辅助密钥/外键。

这使得nhibernate映射变得更加容易!