【发布时间】:2011-09-10 06:28:54
【问题描述】:
在过去的 3 天里,我一直在为一种有趣的行为而苦苦挣扎,至少对我来说是这样。
基本概念如下:在内存中创建一个对象,这个对象有一个子列表。这个对象被保存到数据库中,孩子也被保存,级联模式。
这工作正常,但如果在我保存之后我尝试删除一个孩子,从列表中删除,这不起作用,列表不会删除孩子。
我发现,HashedSet 类型的列表以某种方式缓存对象的哈希码,当它第一次插入列表时,在保存之前,在保存之后,相同的对象没有相同的哈希码。但是该列表仍然假定旧的哈希码。
我已经覆盖了GetHashCode 和Equals,经过大量的谷歌搜索和阅读,我找到了一个blog post,它解释了nhibernate 对GetHashCode 和Equals 方法的使用。
这是我的实现
public override int GetHashCode()
{
if (orgHashCode.HasValue)
return orgHashCode.Value;
var hashCode = 17;
var signatureProperties = GetSignatureProperties();
if (!IsTransient())
hashCode = (hashCode*HASH_MULTIPLIER) ^ GetIdValue().GetHashCode();
else
{
foreach (var property in signatureProperties)
{
object value = property.GetValue(this, null);
if (value != null)
hashCode = (hashCode*HASH_MULTIPLIER) ^ value.GetHashCode();
}
}
if (!orgHashCode.HasValue)
orgHashCode = hashCode;
// If no properties were flagged as being part of the signature of the object,
// then simply return the hashcode of the base object as the hashcode.
return signatureProperties.Any() ? hashCode : base.GetHashCode();
}
public override bool Equals(object obj)
{
var compareTo = obj as DbCommonBase;
if (ReferenceEquals(this, compareTo))
return true;
return compareTo != null &&
GetType().Equals(compareTo.GetUnproxiedType()) &&
(HasSameNonDefaultIdAs(compareTo) || ((IsTransient()) || compareTo.IsTransient()) &&
HasSameObjectSignatureAs(compareTo));
}
我使用了一个名为 orgHashCode 的变量,它在生成第一个哈希码之前返回哈希码,如果我使用这种方法,它似乎可以工作,但我认为这不是最好的解决方案,应该为当前生成哈希码对象而不是它的“第一个版本”。
我不知道我的解释是否足够清楚。 任何提示将不胜感激。 谢谢
【问题讨论】:
标签: nhibernate equals persistent gethashcode transient