エンティティはデフォルトで主キー比較による等価性を実装する必要があると思いますが、nhibernate のドキュメントではビジネス ID の使用が推奨されています。
最も明白な方法は、両方のオブジェクトの識別子の値を比較して Equals()/GetHashCode() を実装することです。値が同じである場合、両方とも同じデータベース行である必要があるため、それらは等しいです (両方が ISet に追加された場合、ISet には 1 つの要素しかありません)。残念ながら、そのアプローチを使用することはできません。NHibernate は永続的なオブジェクトにのみ識別子の値を割り当てます。新しく作成されたインスタンスには識別子の値はありません! ビジネス キーの等価性を使用して、Equals() と GetHashCode() を実装することをお勧めします。
ビジネス キーの等価性とは、Equals() メソッドがビジネス キーを形成するプロパティのみを比較することを意味します。これは、現実世界でインスタンスを識別するキー (自然な候補キー) です。
そして例(これもドキュメントから):
public override bool Equals(object other)
{
if (this == other) return true;
Cat cat = other as Cat;
if (cat == null) return false; // null or not a cat
if (Name != cat.Name) return false;
if (!Birthday.Equals(cat.Birthday)) return false;
return true;
}
ビジネス ID の概念 (例によると) は構文による比較と同じであり、これは基本的に ValueObjects に関連付けるタイプのセマンティクスであるため、これには頭が回転します。データベースの主キーを比較値として使用しない理由は、クライアント側で主キーが生成されず (インクリメンタルなど)、何らかのハッシュテーブル コレクション (ISet など) を使用する場合、オブジェクトのハッシュコードが変更されるためです。エンティティを保存するため。
equality/hashcode ( http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx ) の一般的なルールに違反せず、nhibernate ルールにも準拠する優れた等価実装を作成するにはどうすればよいですか?