Рекомендуется (и я добился большого успеха), что если вы используете CompositeKeys, вы используете объект ID в соответствии с:
NHibernate и Composite Keys
В вашем случае вы бы создали новый класс ...
[Serializable]
public MyEntityIdentifier
{
public virtual TYPE Id_1;
public virtual TYPE Id_2;
// You need to override Equals(MyEntityIdentifier), Equals(object obj) and GetHashCode()
}
Тогда ваше отображение станет
public class MyEntityMappingOverride : IAutoMappingOverride<MyEntity>
{
public void Override(AutoMapping<MyEntity> mapping)
{
mapping.CompositeId()
.ComponentCompositeIdentifier(x => x.MyEntityIdentifier)
.KeyProperty(x => x.MyEntityIdentifier.Id_1, Id_1, "Id_1")
.KeyProperty(x => x.MyEntityIdentifier.Id_2, "Id_2");
// snip
}
}
И ваш класс перестанет иметь два свойства (Id_1 & Id_2) просто иметь MyEntityIdentifier.
Затем вы используете свой MyEntityIdentifier там, где требуется загрузить ..
MyEntity entity = Session.Load<MyEntity>(new MyEntityIdentifier { Id_1 = Whatever, Id_2 = Whatever });
А также, если у вас есть ЛЮБОЙ контроль над этой базой данных, я НАСТОЯТЕЛЬНО рекомендую не использовать CompositeKeys,В то время как NHibernate определенно справится с ними, у них есть немного дополнительных умственных сложностей и проблем.