我已經重寫了抽象基類中的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 id的項目實現相同的模式,所以顯然不起作用。
在我看來,覆蓋Equals的任何對象都將在對象實例化後立即與同一對象的任何其他實例相等。
編輯補充: 這裏是與我有關的場景:在Add方法對我的收藏,我檢查,以確保該集合尚未包含要添加的對象。如果所有新建的對象都是相同的,那麼我永遠不會向集合添加兩個新對象。
好點...我不認爲我會在ISessions之間保留任何集合引用。 – 2009-04-08 23:09:11