Nhibernate強制您使用Iesi Set,而不是Net 4 ISet接口。在下面的代碼片段中,我檢查一個iesi集合是否包含一個項目:Nhibernate iesicollection包含返回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。我已經添加了測試變量,只是將代碼作爲臨時度量來檢查。 我重寫這樣的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
怎麼會是完全相同的對象不使用含有該集合的方法集合中發現的?我甚至可以在調試器中執行此操作:
_substances.Contains(_substances.First())
false
顯然,_substances.Remove(物質)也不起作用。經過一些額外的研究後,我發現NH用它自己的Persistent Generic集取代了集合。使用該組時,會出現問題。如果我從該集合中檢索一個項目,並且在同一集合上調用Contains,它總是返回false。我重寫了GetHashCode和Equals,甚至在Equals方法中返回true。
你是否也覆蓋了Equals方法?像http://blog.visualt4.com/2009/03/nhibernate-why-override-gethashcode-and.html – Bas
是的,我甚至把它的真相,沒有任何結果。這是我與Nhibernate的另一個拉毛問題。 – halcwb