NHibernate, не составной идентификатор и GetHashCode - PullRequest
2 голосов
/ 04 января 2012

Когда моя модель домена имеет составной ключ в базе данных, я получу исключение, если забуду переопределить Equals / GetHashCode

NHibernate.MappingException: composite-id class must override Equals():

Почему это не выдает мне ту же ошибку, когда у меня не составнойID

1 Ответ

3 голосов
/ 04 января 2012

NHibernate использует значение первичного ключа вашего класса в своем внутреннем движке отслеживания состояния для идентификации этого экземпляра.

Если у вас есть одно свойство первичного ключа в вашем домене, NHibernate будет использовать значение, возвращаемое свойством, в качестве значения ключа, вызывая GetHashcode и Equals для значения, используя первичный ключ, очень похожий навы можете использовать его в экземпляре Dictionary<TKey,TValue>.

Когда существует несколько свойств первичного ключа, образующих составной ключ, у NHibernate нет простого способа получить значение ключа, которое он может использовать.Это требует, чтобы вы определили, как определить равенство между двумя экземплярами, эффективно превратив экземпляр в его собственный ключ, так же, как это было бы в HashSet<T>.

Если вы не переопределили Equals и GetHashCode в своем типе для использования значений составного ключа, это не отражает "равенство", используемое моделью данных (две строки равны, если онииметь один и тот же первичный ключ), и NHibernate не может быть уверен, что он отслеживает правильные объекты;вот почему возникает исключение.

Вы можете найти обзор составных ключей и больше информации о хитрых способах их обработки здесь .

...