ドキュメントからの一節がありNHibernate
ます:
注: 複合要素の を定義する場合は、正しく
ISet
実装することが非常に重要です。Equals()
GetHashCode()
とはcorrectly
どういう意味ですか? ドメイン内のすべての値オブジェクトに対してこれらのメソッドを実装する必要がありますか?
私の質問を拡張する
記事の中で、Marcが添付したユーザーAlbicは次のように述べています。
GetHashCode()
Marc が既に述べた規則に加えて、ハッシュ コードはオブジェクトの存続期間中に変更されるべきではないため、正しく実装するのは実際には非常に困難です。したがって、ハッシュ コードの計算に使用されるフィールドは不変でなければなりません。で作業していたときに、ようやくこの問題の解決策を見つけました
NHibernate
。私のアプローチは、オブジェクトの ID からハッシュ コードを計算することです。ID はコンストラクターを介してのみ設定できるため、ID を変更したい場合 (これはほとんどありません)、新しい ID と新しいハッシュ コードを持つ新しいオブジェクトを作成する必要があります。ID をランダムに生成するパラメーターなしのコンストラクターを提供できるため、このアプローチは GUID に最適です。
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()
ますか?