Nhibernate заставляет вас использовать набор Iesi вместо интерфейса net 4 ISet. В следующем фрагменте кода я проверяю, содержит ли набор iesi элемент:
public virtual void Remove(Substance substance)
{
var test = _substances.First() == substance;
if (!_substances.Contains(substance)) return;
_substances.Remove(substance);
substance.SubstanceGroup = null;
}
Переменная _substances ссылается на HashedSet. Я добавил тестовую переменную просто для проверки кода в качестве временной меры. У меня метод Equals переопределен следующим образом:
public override int GetHashCode()
{
return Equals(Id, default(TId)) ? base.GetHashCode() : Id.GetHashCode();
}
Это приводит к тому, что элемент возвращает идентификатор (Guid) в виде хэша. Если я проверю в отладчике, я получу следующий результат:
test
true
_substances.Contains(substance)
false
_substances.First().GetHashCode()
-2974953
substance.GetHashCode()
-2974953
Как может быть, что точно такой же объект не обнаруживается в коллекции с помощью метода contains этой коллекции?? Я даже могу сделать это в отладчике:
_substances.Contains(_substances.First())
false
Очевидно, что _substances.Remove(substance) тоже не работает. После некоторых дополнительных исследований я обнаружил, что NH заменяет коллекцию своим собственным набором Persistent Generic. Проблема возникает при использовании этого набора. Если я извлекаю элемент из этого набора и вызываю «Содержит» для того же набора, он всегда возвращает false. Я переопределил GetHashCode и Equals, даже установил return true в методе Equals.