NHibernate использует значение первичного ключа вашего класса в своем внутреннем движке отслеживания состояния для идентификации этого экземпляра.
Если у вас есть одно свойство первичного ключа в вашем домене, NHibernate будет использовать значение, возвращаемое свойством, в качестве значения ключа, вызывая GetHashcode
и Equals
для значения, используя первичный ключ, очень похожий навы можете использовать его в экземпляре Dictionary<TKey,TValue>
.
Когда существует несколько свойств первичного ключа, образующих составной ключ, у NHibernate нет простого способа получить значение ключа, которое он может использовать.Это требует, чтобы вы определили, как определить равенство между двумя экземплярами, эффективно превратив экземпляр в его собственный ключ, так же, как это было бы в HashSet<T>
.
Если вы не переопределили Equals
и GetHashCode
в своем типе для использования значений составного ключа, это не отражает "равенство", используемое моделью данных (две строки равны, если онииметь один и тот же первичный ключ), и NHibernate не может быть уверен, что он отслеживает правильные объекты;вот почему возникает исключение.
Вы можете найти обзор составных ключей и больше информации о хитрых способах их обработки здесь .