Nhibernate заставляет вас использовать Iesi Set вместо интерфейса 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.Я добавил тест var, чтобы проверить код как временную меру.У меня есть метод Equals, переопределенный так:
public override int GetHashCode()
{
return Equals(Id, default(TId)) ? base.GetHashCode() : Id.GetHashCode();
}
Это заставляет элемент возвращать Id (Guid) в виде хэша.Если я проверяю в отладчике, я получаю следующий результат:
test
true
_substances.Contains(substance)
false
_substances.First().GetHashCode()
-2974953
substance.GetHashCode()
-2974953
Как может случиться так, что точно такой же объект не будет обнаружен в коллекции, используя метод contains этой коллекции ??Я даже могу сделать это в отладчике:
_substances.Contains(_substances.First())
false
Очевидно, _substances.Remove (вещество) тоже не работает.После некоторых дополнительных исследований я обнаружил, что NH заменяет коллекцию собственным набором Persistent Generic.Проблема возникает, когда этот набор используется.Если я извлекаю элемент из этого набора и вызываю Contains в том же наборе, он всегда возвращает false.Я переопределил GetHashCode и Equals, даже поставил return true в методе Equals.