Nhibernate는 net 4 ISet 인터페이스 대신 Iesi Set를 사용하도록합니다.Nhibernate iesicollection contains에 false가 반환됩니다.
public virtual void Remove(Substance substance)
{
var test = _substances.First() == substance;
if (!_substances.Contains(substance)) return;
_substances.Remove(substance);
substance.SubstanceGroup = null;
}
변수 _substances는 HashedSet을 참조 : 다음 코드 조각에서 나는 iesi 세트 항목이 포함되어 있는지 확인합니다. 임시 변수로 코드를 검사하기 위해 test var를 추가했습니다.
public override int GetHashCode()
{
return Equals(Id, default(TId)) ? base.GetHashCode() : Id.GetHashCode();
}
이 해시로 아이디 (GUID)를 반환 할 항목을 발생합니다 나는 이런 식으로 무시 Equals 메서드가 있습니다. 나는 다음과 같은 결과를 얻을 디버거에서 확인하는 경우 :
test
true
_substances.Contains(substance)
false
_substances.First().GetHashCode()
-2974953
substance.GetHashCode()
-2974953
가 어떻게 정확히 같은 객체가 그 수집의 방법을 포함하여 컬렉션에서 발견되지 않는다는 될 수 있습니다 ?? 심지어 디버거에서이 작업을 수행 할 수 있습니다.
_substances.Contains(_substances.First())
false
분명히 _substances.Remove (substance)도 작동하지 않습니다. 추가 연구가 끝난 후 NH가 컬렉션을 자체 퍼시스턴트 일반 세트로 대체한다는 사실을 알게되었습니다. 이 세트가 사용될 때 문제가 발생합니다. 해당 집합에서 항목을 검색하고 같은 집합에 대해 Contains를 호출하면 항상 false를 반환합니다. GetHashCode 및 Equals를 재정의하고 Equals 메서드에서 true를 반환합니다.
또한 Equals 메서드를 재정의 하시겠습니까? http://blog.visualt4.com/2009/03/nhibernate-why-override-gethashcode-and.html – Bas
예, 결과가 없어도 반환 할 수 있습니다. 이것은 Nhibernate와 관련된 또 하나의 문제입니다. – halcwb