Как мне сопоставить первичный ключ с n столбцами с помощью nHibernate? - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть таблица с 2 столбцами в качестве PK (составной первичный ключ).

Как мне сопоставить их с "Id" в hbm.xml?

<id name="A" />  

Как я могу сделать это с беглым nhibernate?

Ответы [ 3 ]

11 голосов
/ 25 ноября 2011

Документация NHibernate описывает, как использовать и отображать составной-идентификатор .

Вы также можете использовать компонент в качестве составного .

А для Fluent NHibernate:

public class ClassNameMap: ClassMap<ClassName>
{
    public ClassNameMap()
    {
        CompositeId().
            .KeyReference(x => x.A, "A")
            .KeyReference(x => x.B, "B");
    }
}
4 голосов
/ 25 ноября 2011

Для составного первичного ключа в 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 name="PropertyOneObjName" column="ColumnOne" class="PropertyOneClassName">

Для быстрой гибернации составной ключ выглядит так:

public ClassName(){
    CompositeId().
        KeyProperty(x => x.IdPropertyOne,"ColumnOne")
        KeyProperty(x => x.IdPropertyTwo,"ColumnTwo")
}
1 голос
/ 25 ноября 2011

попробуйте это для 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>  

надеюсь, что это поможет вам ...: -)

...