【发布时间】:2011-08-25 13:06:55
【问题描述】:
Nhibernate 强制您使用 Iesi Set,而不是 net 4 ISet 接口。在下面的代码 sn-p 中,我检查 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,甚至在Equals方法中加入了return true。
【问题讨论】:
-
您是否也覆盖了 Equals 方法?喜欢blog.visualt4.com/2009/03/…
-
是的,我什至在里面放了return true,没有任何结果。这是我在使用 Nhibernate 时遇到的另一个令人头疼的问题。
标签: nhibernate contains nhibernate-collections