抽象基本クラスでEqualsとGetHashCodeをオーバーライドして、オブジェクトのキープロパティに基づいて値の等価性を実装しました。私の主な目的は、コレクションにContainsメソッドを使用して、FindまたはFirstOrDefaultの代わりにインスタンスがコレクションに既に追加されているかどうかを確認できるようにすることです。新しいオブジェクトの値の等値比較
public abstract class Entity
{
public abstract Guid Id { get; }
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (obj.GetType() != GetType())
{
return false;
}
var entity = (Entity)obj;
return (entity.Id == Id);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
このアプローチの問題は、永続化され、Id(NHibernateによって生成された)を取得する前にすべてのオブジェクトが等しいことです。私はそれを間違っているのですか?私はコンストラクタでIdを生成することができましたが、int iidを使用する他のプロジェクトでも同じパターンを実装したいので、明らかに動作しません。
オブジェクトがインスタンス化された直後に、等しいオブジェクトをオーバーライドするオブジェクトは、同じオブジェクトの他のインスタンスと等しくなります。
は編集を追加する: をここで私に関するシナリオです:私のコレクションのAddメソッドでは、私はコレクションはすでに追加されるオブジェクトが含まれていないことを確認するためにチェックしています。 new'ed upオブジェクトがすべて等しい場合、コレクションに2つの新しいオブジェクトを追加することはできません。
良い点...私はISession間でコレクションの参照を保持しているとは思いません。 –