Для составного первичного ключа в 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")
}