Вам нужно необходимо переопределить Equals, как предполагает Грзенио, но следите за тонким источником путаницы, которая может возникнуть с NHibernate.В частности, если включена отложенная загрузка, проверка сравнения типов может завершиться неудачей.Для иллюстрации приведем фрагмент хорошо написанного метода Equals:
// override object.Equals
public override bool Equals(object obj)
{
//
// See the full list of guidelines at
// http://go.microsoft.com/fwlink/?LinkID=85237
// and also the guidance for operator== at
// http://go.microsoft.com/fwlink/?LinkId=85238
//
if (GetType() != obj.GetType())
{
return false;
}
....
}
Но когда включена отложенная загрузка, NHib работает так, чтобы сгенерировать прокси фактического объекта (таким образом откладывая ненужные обращения к базе данных).,Если выполняется проверка на равенство между одним объектом, который был «проксифицирован» NHib, и другим, который не был, это приведет к сбою из-за несоответствия типов.Решение (любезно предоставленное проектом S # arp Architecture ) состоит в том, чтобы изменить тип теста таким образом:
public override bool Equals(object obj) {
...
if (GetType() != obj.GetTypeUnproxied())
{
return false;
}
...
}
protected virtual Type GetTypeUnproxied() { return GetType(); }
. Это эффективно возвращает тип базового объекта во всехслучаи, даже когда объект CompareTo является прокси-сервером NHib.
Метод Equals может быть настолько сложным, насколько это важно для правильного выбора, поэтому в идеале вы можете включить его в некоторый вид супертипа слоя (Fowler).Множество проектов с открытым исходным кодом, включая S # arp, который я упоминал ранее, предоставляют примеры того, как это сделать.
HTH,
Berryl