如何使用nHibernate映射n列主键

时间:2011-11-25 13:34:18

标签: .net nhibernate fluent-nhibernate composite-primary-key

我有一个包含2列作为PK(复合主键)的表。

如何将它们映射到hbm.xml中的“Id”?

<id name="A" />  

我怎么能用流利的nhibernate来做呢?

3 个答案:

答案 0 :(得分:10)

NHibernate文档介绍了如何使用和映射composite-id

您还可以使用component as compositeid

对于Fluent NHibernate:

public class ClassNameMap: ClassMap<ClassName>
{
    public ClassNameMap()
    {
        CompositeId().
            .KeyReference(x => x.A, "A")
            .KeyReference(x => x.B, "B");
    }
}

答案 1 :(得分:4)

对于nHibernate中的复合主键,我建议使用;

对于hbm.xml:

<hibernate-mapping>   
<class table="TableName" name="Namespace.ClassName, ClassName">
<composite-id>
    <key-property name="IdPropertyOne" column="ColumnOne" />
    <key-property name="IdPropertyTwo" column="ColumnTwo" />
</composite-id>
<property name="PropertyName" column="ColumnName" type="String"></property>
</class>
</hibernate-mapping>

然后您应该覆盖等于 GetHashCode 方法,以便nHibernate知道如何比较新密钥和识别不同对象。这取决于你愿意走多远,你也可以通过使用“key-many-to-one”来映射外键。

对于密钥多对一:

<key-many-to-one name="PropertyOneObjName" column="ColumnOne" class="PropertyOneClassName">

对于流畅的休眠,复合键看起来像:

public ClassName(){
    CompositeId().
        KeyProperty(x => x.IdPropertyOne,"ColumnOne")
        KeyProperty(x => x.IdPropertyTwo,"ColumnTwo")
}

答案 2 :(得分:1)

试试NHibernate ......

<composite-id name="Key" class="KeyClass"> 
  <key-many-to-one name="first" column="firstColumn" lazy="proxy" class="FirstClass"/>
  <key-many-to-one name="second" column="secondColumn" lazy="proxy" class="SecondClass"/>
</composite-id>

和流利的Hibernate

<composite-id>  
  <key-property type="Int32" name="first" column="firstColumn" />  
  <key-property type="Int32" name="second" column="secondColumn" />  
</composite-id>  

希望能帮助你......: - )