Nhibernate では、net 4 ISet インターフェイスの代わりに Iesi Set を使用する必要があります。次のコード スニペットでは、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 セットに置き換えることがわかりました。このセットを使用すると問題が発生します。そのセットからアイテムを取得し、同じセットで Contains を呼び出すと、常に false が返されます。GetHashCode と Equals をオーバーライドし、Equals メソッドに return true を入れました。