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。我添加了测试变量只是为了检查代码作为临时措施。我像这样重写了 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(substance) 也不起作用。经过一些额外的研究后,我发现 NH 用它自己的 Persistent Generic 集替换了该集合。使用此套件时会出现问题。如果我从该集合中检索一个项目并在同一集合上调用包含,它总是返回 false。我已经覆盖了 GetHashCode 和 Equals,甚至将 return true 放在 Equals 方法中。