Спасибо за публикацию ответа выше, я смотрел его на сопоставленном объекте, где у составного ключа нет имени или класса. Когда я попытался создать класс для представления составного ключа, он изменил поведение объекта при использовании другим кодом. Также я хотел написать что-то вроде;
Session.Get<SalesRepArea>(new { AreaCode = "ACode", RegionCode = "RCode"});
Я обнаружил, что nHibernate не может иметь большого смысла в анонимном объекте, но я понял, что мне не нужно имя для моего составного ключа или тип класса. Что такое метод Get nHibernate после, по сути, является временным объектом, так что он может получить свой эквивалентный объект из базы данных (должно быть, поэтому вам нужно переопределить метод equals в вашем классе C #, чтобы заставить работать составной ключ). Так для следующей карты
<class name="SalesRepArea">
<composite-id>
<key-property
name="AreaCode" column="AreaCode" type="String" length="12" />
<key-property
name="RegionCode" column="RegionCode" type="String" length="12" />
</composite-id>
Я пишу немного меньше кода и отказываюсь от объекта, представляющего ключ, чтобы получить
SalesRepArea myArea = Session.Get<SalesRepArea>(
new SalesRepArea()
{
AreaCode = "ACode",
RegionCode = "RCode"
}
);
Я не говорю, что метод именованного ключа плох, меньше кода не всегда лучше, это просто чтобы показать, что Hibernate ищет объект, в котором находится ключ, чтобы получить конкретный объект из базы данных.
Если я ошибся, пожалуйста, дайте мне знать, но я надеюсь, что это поможет, так как у меня были небольшие проблемы с этим.
Спасибо
Mark