Ben Varlıkları varsayılan olarak birincil anahtar kıyasla eşitliği hayata geçirmesi gerektiğini düşünüyorum, ama nhibernate dokümantasyon iş kimliğini kullanarak önerir: tanımlayıcı değeri karşılaştıraraknhibernate: eşitliği uygulamak için en iyi yöntemler nelerdir?
en açık yolu (Eşittir uygulamaktır)/GetHashCode() her iki nesnenin Değer aynı ise, her ikisi de aynı veritabanı satırı olmalıdır, dolayısıyla eşittirler (her ikisi de bir ISet'e eklenirse, yalnızca ISet'te bir öğeye sahip oluruz). Maalesef bu yaklaşımı kullanamıyoruz. NHibernate sadece tanımlayıcı değerleri kalıcı olan nesnelere atayacak, yeni oluşturulan bir örnek herhangi bir tanımlayıcı değere sahip olmayacaktır! İş anahtarı eşitliğini kullanarak Equals() ve GetHashCode() uygulamasını öneririz.
İş anahtar eşitlik demek ki Eşittir() yöntemi iş anahtarını, gerçek dünyada bizim örneğini tespit edecek bir tuşa (doğal aday anahtar)
Ve örneğini oluşturan sadece özelliklerini karşılaştırır (ayrıca dokümandan):
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;
}
Bu iş kimlik kavramı (örneğin göre) nedeniyle iplik kafam ValueObjects ile ilişkilendirmek semantik türü temelde sözdizimi ile karşılaştırıldığında, aynı got . Veritabanı birincil anahtarlarını karşılaştırma değerleri olarak kullanmamanın nedeni, birincil anahtarın istemci tarafında üretilmemesi (eskiden artımlı olarak) ve bu tür bir hashtable koleksiyonunun (örneğin, ISet gibi) kullanılması durumunda nesnenin karma kodunu değiştireceğidir. varlıklarınızı depolamak için.
Eşitlik/hashcode (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx) için genel kuralları ihlal etmeyen ve nhibernate kurallarına uymayan iyi bir eşitlik uygulamasını nasıl oluşturabilirim?
Neden (özellikle) Equals'ı kullanmak ister misiniz? – apollodude217