2009-04-20 9 views
15

Ist es möglich, eine schreibgeschützte Verbindung in nHibernate zu erstellen?Wie erstellt man eine schreibgeschützte Sitzung in nHiberate?

Schreibgeschützt: wo nHibernate keine Änderungen an der zugrunde liegenden Datenbank implizit oder explizit ausspült.

Beim Schließen einer nhibernate-Verbindung werden die Änderungen am persistenten Objekt automatisch gelöscht.

Einstellen des Flush-Modus auf nie ist eine Möglichkeit - ist aber umkehrbar (d. H. Einige Code kann den Flush-Modus zurücksetzen).

+0

Ich weiß, dies ist eine alte Frage (in Internet-Zeit), aber was ist der Grund für Ihre Sorge darüber, dass es "umkehrbar" ist? –

Antwort

13

Ich denke, Sie haben bereits die Lösung gefunden, den Spülmodus nie einstellen. Ja, es ist veränderbar, aber selbst wenn nicht, könnte Code einfach eine andere Sitzung erstellen, die einen anderen Löschmodus hat.

ich glaube, die richtige Lösung zu read-only mit session.FlushMode = FlushMode.Never vorschlagen und ihm erzwingen, indem eine Verbindung mit der Datenbank, die nur SELECT-Berechtigungen (für Ihre Situation oder was auch immer angemessen ist) hat. Das Verwalten separater ISessionFactory-Factorys hilft möglicherweise, indem Sie etwas wie ReadOnlySessionFactory.Create() zulassen.

0

Accumulating Updates und einfach nie Spülung scheint wie eine schlechte Lösung für mich zur Verfügung standen. Ich habe eine ähnliche Frage gestellt. Die bereitgestellte Lösung verwendet einen anderen Ansatz. Alle Ereignisse werden auf leer gesetzt und somit ignoriert. Mein Gefühl ist, dass es ein besserer Ansatz ist.

Ich bin überrascht, dass dies nicht einfacher zu tun ist. Ich mag den Entity-Framework-Ansatz der Verwendung einer Erweiterungsmethode .AsNoTracking(), die sicherstellt, dass Read-Only-Abfragen auf diese Weise bleiben.

How to create an NHibernate read-only session with Fluent NHibernate that doesn't accumulate updates?

+0

Nein, Aktualisierungen werden nach dem Festlegen von session.FlushMode = FlushMode.Never nicht akkumuliert. Ich habe es überprüft, indem ich SaveOrUpdateEventListeners wie in deiner Frage überschrieben habe und der Listener nicht mit FlushMode.Never aufgerufen wurde. In Ihrer Lösung wird NoOpEventListener für jede Änderung aufgerufen – razon

1

Es gibt eine neuere Nur-Lese-Funktion in NHibernate (Ich weiß nicht, welche Version, aber es ist in 3.3.0 für sicher). Sie können die Sitzung festgelegt, dies zu lesen nur mit:

session.DefaultReadOnly = true 

Es deaktiviert den Cache für alte Werte und damit verbessert die Leistung und Speicherverbrauch.

Es gibt eine chapter about read-only entities in der NHibernate reference documentation.

Verwandte Themen