Meine persönlichen "häufig erklärten" Probleme:
Anti-Patterns
Spielen Sie mit losgelösten Objekten (SaveOrUpdate oder Merge plus etwas chaotischen Code) herum, anstatt DTOs zu verwenden. Je komplexer die Entitäten sind, desto chaotischer ist der Code. (Dies bedeutet auch, dass es mit trivialen Entitäten recht gut funktioniert.) Ayende nennt es auch das Stripper-Muster und erklärt das Verkapselungsproblem.
Nicht verstehen, Persistenz Ignoranz und Schreiben von NH-Anwendungen wie bei der Verwendung von explizitem SQL. Symptom dafür: Aufrufen von Update nach dem Ändern eines Objekts. Fragen Sie sich, warum Änderungen beibehalten werden, auch wenn Update nicht aufgerufen wurde. Fragen Sie sich, wie Sie verhindern können, dass Änderungen beibehalten werden.
Nicht verstehen, Transaktionen und die Einheit des Arbeitsmusters . Häufige Antimuster: implizite Transaktionen, Sitzung pro Operation und Sitzung pro Anwendung. Noch etwas lesen:
Verwenden von NH- Ereignissen zum Einfügen von Anwendungslogik (z. B. Änderungsnachverfolgung in Einfüge- und Aktualisierungs-Triggern)
Erstellen Sie eine Klasse pro Tabelle . Einige Leute verstehen OOD nicht, andere verstehen relationales Design nicht.
Fehler
Verwendung von eins zu eins anstelle von vielen zu eins. Ich versuchte es in dieser Antwort zu erklären .
Verwenden von Join-Abruf in Kombination mit SetMaxResult. Meine neuesten Antworten zu diesem Thema:
Selbstverändernde Entitäten schreiben . Wenn eine Entität den von NH festgelegten Wert nicht genau zurückgibt, gilt sie als fehlerhaft und wird in jeder Sitzung aktualisiert. Beispiel: Ersetzen der persistenten NH-Sammlung in einem Eigenschaftssetter.
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; }
}
Vielleicht folgt noch mehr.