Mes problèmes personnels "fréquemment expliqués":
Anti-Patterns
Jouer avec des objets détachés (SaveOrUpdate ou Merge plus du code en désordre) au lieu d'utiliser des DTO. Plus les entités sont complexes, plus le code est compliqué. (Cela signifie également qu'il fonctionne assez bien avec des entités triviales.) Ayende l'appelle également le modèle de décapage et explique le problème d'encapsulation.
Ne pas comprendre l'ignorance de la persistance et écrire des applications NH comme lors de l'utilisation de SQL explicite. Symptôme: appeler Update après avoir changé un objet, se demander pourquoi les changements sont persistants même si Update n'a pas été appelé, se demander comment éviter que les changements soient persistants.
Ne pas comprendre les transactions et l' unité de travail . Anti-patterns fréquents: transactions implicites, session par opération et session par application. Un peu plus de lecture:
Utilisation d' événements NH pour intégrer la logique d'application (par exemple, suivi des modifications dans les déclencheurs d'insertion et de mise à jour)
Créez une classe par table . Certaines personnes ne comprennent pas OOD, d'autres ne comprennent pas la conception relationnelle.
Erreurs
utilisation de un à un au lieu de plusieurs à un. Je l'ai essayé d'expliquer dans cette réponse .
Utilisation de l' extraction de jointure en combinaison avec SetMaxResult. Mes dernières réponses liées à ce sujet:
Écriture d'entités auto-changeantes . Lorsqu'une entité ne retourne pas exactement la valeur qui avait été définie par NH, elle est considérée comme sale et est mise à jour à chaque session. Par exemple: remplacer la collection persistante NH dans un ensemble de propriétés.
IList<Address> Addresses
{
get { return addresses; }
// will cause the addresses collection to be built up from scratch
// in the database in every session, even when just reading the entity.
set { addresses = new List<Address>(value); }
}
int Whatever
{
// will make the entity dirty after reading negative values from the db.
// this causes unexpected updates after just reading the entity.
get { if (whatever < 0) return 0; }
set { whatever = value; }
}
Peut-être plus suit.