Was sind die häufigsten Fehler und Anti-Patterns, die Anwenderprogrammierer von NHibernate machen? Bitte erläutern Sie, warum dies schlechte Praktiken sind, oder geben Sie einen Link zu einer Ressource, die Sie weiterlesen können.
Beispielsweise:
- Ein für neue NHibernate-Programmierer übliches Anti-Pattern ist die Verwendung von Identity / Native POIDs anstelle von ORM-Style-Onces. Lesen Sie hier mehr ...
nhibernate
Darius Kucinskas
quelle
quelle
Antworten:
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.
Vielleicht folgt noch mehr.
quelle
Das " Select N + 1 Problem ".
Hier führen Sie eine Auswahl für jedes Objekt aus, das Sie bearbeiten möchten (N), und eine Auswahl, um die Liste der Objekte (+1) zu erhalten, anstatt eine einzige Auswahl aller Objekte und ihrer Attribute.
quelle
FluentNHibernate
quelle
Versuchen Sie es zu abstrahieren, damit Sie zu einem späteren Zeitpunkt zu Entity Framework (oder etwas anderem) wechseln können.
Das ist viel, viel schwieriger als die meisten Menschen, die es versuchen, zu realisieren. Es gibt zahlreiche Unterschiede zwischen den beiden, die Sie in einer Weise stolpern können, die manchmal sehr subtil sein kann. Es ist auch sehr ungewöhnlich, dass es am Ende tatsächlich benötigt wird - so sehr, dass Sie jahrelang sorgfältig versuchen können, es umzusetzen, bevor Sie feststellen, dass Ihr Ansatz völlig falsch ist.
Darüber hinaus können Sie nicht viele nützliche und wichtige Funktionen von NHibernate nutzen, z. B. Zwischenspeichern auf zweiter Ebene, Abfangen, Parallelitätsverwaltung, Änderungsverfolgung, Vorablesezugriffsabfragen usw.
Wenn es wirklich notwendig wäre, zwischen NHibernate und Entity Framework umzuschalten, gäbe es ein aktiv entwickeltes Projekt, um dies auf GitHub (möglicherweise ähnlich wie CommonServiceLocator) mit zahlreichen Mitwirkenden und Pull-Anfragen zu unterstützen.
quelle