文档中有一段话NHibernate
:
注意:如果你定义了一个
ISet
复合元素,那么正确的实现Equals()
和实现是非常重要的GetHashCode()
。
那里是什么correctly
意思?是否有必要为域中的所有值对象实现这些方法?
扩展我的问题
在Marc附加的用户Albic的文章中说:
实际上很难
GetHashCode()
正确实现,因为除了 Marc 已经提到的规则之外,哈希码在对象的生命周期内不应该改变。因此,用于计算哈希码的字段必须是不可变的。当我使用
NHibernate
. 我的方法是根据对象的 ID 计算哈希码。ID 只能通过构造函数设置,因此如果您想更改 ID(这不太可能),您必须创建一个具有新 ID 的新对象,因此需要一个新的哈希码。这种方法最适用于 GUID,因为您可以提供随机生成 ID 的无参数构造函数。
我突然意识到我在AbstractEntity
课堂上得到了什么:
public abstract class AbstractEntity<T> where T : AbstractEntity<T> {
private Nullable<Int32> hashCode;
public virtual Guid Id { get; protected set; }
public virtual Byte[] Version { get; set; }
public override Boolean Equals(Object obj) {
var other = obj as T;
if(other == null) {
return false;
}
var thisIsNew = Equals(this.Id, Guid.Empty);
var otherIsNew = Equals(other.Id, Guid.Empty);
if(thisIsNew && otherIsNew) {
return ReferenceEquals(this, other);
}
return this.Id.Equals(other.Id);
} // public override Boolean Equals(Object obj) {
public override Int32 GetHashCode() {
if(this.hashCode.HasValue) {
return this.hashCode.Value;
}
var thisIsNew = Equals(this.Id, Guid.Empty);
if(thisIsNew) {
this.hashCode = base.GetHashCode();
return this.hashCode.Value;
}
return this.Id.GetHashCode();
} // public override Int32 GetHashCode() {
public static Boolean operator ==(AbstractEntity<T> l, AbstractEntity<T> r) {
return Equals(l, r);
}
public static Boolean operator !=(AbstractEntity<T> l, AbstractEntity<T> r) {
return !Equals(l, r);
}
} // public abstract class AbstractEntity<T>...
由于所有components
内容都嵌套在其中,因此我应该为它们entities
实施Equals()
和实施吗?GetHashCode()