Je pense que les entités devraient mettre en œuvre l'égalité par rapport clé primaire par défaut, mais la documentation NHibernate recommande d'utiliser l'identité de l'entreprise:nhibernate: quelles sont les meilleures pratiques pour la mise en œuvre de l'égalité?
La façon la plus évidente est d'implémenter equals()/GetHashCode() en comparant la valeur d'identifiant des deux objets. Si la valeur est la même, les deux doivent être la même ligne de la base de données, ils sont donc égaux (si les deux sont ajoutés à un ISet, nous n'aurons qu'un seul élément dans l'ISet). Malheureusement, nous ne pouvons pas utiliser cette approche. NHibernate affectera uniquement des valeurs d'identifiant aux objets qui sont persistants, une instance nouvellement créée n'aura aucune valeur d'identifiant! Nous vous recommandons d'implémenter Equals() et GetHashCode() en utilisant l'égalité des clés métier.
méthode affaires égalité clé signifie que les equals() compare uniquement les propriétés qui forment la clé de l'entreprise, une clé qui identifierait notre instance dans le monde réel (une clé candidate naturelle)
Et l'exemple (également de la doc):
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;
}
Ceci a obtenu ma tête tourner parce que la notion d'identité d'entreprise (selon l'exemple) est la même que la comparaison par la syntaxe, qui est essentiellement le type de sémantique I associe avec ValueObjects . La raison de ne pas utiliser les clés primaires de base de données comme valeurs de comparaison est que cela changera le hashcode de l'objet si la clé primaire n'est pas générée côté client (ex incremental) et que vous utilisez une sorte de collection hashtable (comme ISet) pour stocker vos entités.
Comment puis-je créer une bonne implémentation d'égalité qui ne brise pas les règles générales de l'égalité/hashcode (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx) et qui est également conforme aux règles nhibernate?
Pourquoi voulez-vous (spécifiquement)/devez-vous utiliser Equals? – apollodude217