In vielen Fällen müssen Sie sich nicht darum kümmern, wann NHibernate geleert wird.
Sie müssen flush nur aufrufen, wenn Sie eine eigene Verbindung erstellt haben weil NHibernate nicht weiß, wann Sie eine Übergabe durchführen.
Was für Sie wirklich wichtig ist, ist die Transaktion. Während der Transaktion sind Sie von anderen Transaktionen isoliert, d.h. Sie sehen immer Ihre eigenen Änderungen, wenn Sie aus der Datenbank lesen, und Sie sehen die Änderungen anderer nicht (es sei denn, sie werden übertragen). Sie müssen sich also nicht darum kümmern, wenn NHibernate Daten in der Datenbank aktualisiert, es sei denn, sie werden übertragen. Sie sind ohnehin für niemanden sichtbar.
NHibernate flusht, wenn
- Sie rufen commit
- vor Abfragen, um sicherzustellen, dass Sie nach dem tatsächlichen Zustand im Speicher filtern
- wenn Sie flush aufrufen
Beispiel:
using (session = factory.CreateSession())
using (session.BeginTransaction())
{
var entity = session.Get<Entity>(2);
entity.Name = "new name";
// there is no update. NHibernate flushes the changes.
session.Transaction.Commit();
session.Close();
}
Die Entität wird bei der Übergabe aktualisiert. NHibernate erkennt, dass Ihre Sitzung verschmutzt ist und überträgt die Änderungen in die Datenbank. Sie müssen nur dann aktualisieren und speichern, wenn Sie die Änderungen außerhalb der Sitzung vorgenommen haben. (Das heißt, mit einer abgetrennten Entität, d.h. einer Entität, die der Sitzung nicht bekannt ist).
Hinweise zur Leistung: Flush führt nicht nur die erforderlichen SQL-Anweisungen zur Aktualisierung der Datenbank aus. Es sucht auch nach Änderungen im Speicher. Da es bei POCOs kein Dirty-Flag gibt, muss es jede Eigenschaft jedes Objekts in der Sitzung mit dem Cache der ersten Ebene vergleichen. Dies kann zu einem Leistungsproblem werden, wenn es zu oft durchgeführt wird. Es gibt einige Möglichkeiten, um Leistungsprobleme zu vermeiden:
- Nicht in Schleifen spülen
- Vermeiden Sie serialisierte Objekte (Serialisierung ist erforderlich, um auf Änderungen zu prüfen)
- Utilice schreibgeschützte Einheiten wenn angebracht
- Satz veränderbar = false wenn angebracht
- Wenn Sie benutzerdefinierte Typen in Eigenschaften verwenden, implementieren Sie effiziente Equals-Methoden
- Deaktivieren Sie die automatische Spülung vorsichtig, wenn Sie sicher sind, dass Sie wissen, was Sie tun.
0 Stimmen
Mögliche Duplikate von NHibernate ISession Flush: Wo und wann wird es verwendet, und warum?