2012-11-12 22 views
6

Ich weiß, das wurde gefragt, aber ich kann dieses Problem nicht lösen.NHIbernate eine Sammlung aktualisieren

Angenommen, Sie haben ein Nhibernate-Objekt mit einer Sammlung.

Problem ist, wenn ein Objekt in der Sammlung in der Datenbank von einem anderen Benutzer aktualisiert wird (ich manuell die Datenbank zu Testzwecken ändern), kann ich nicht finden, eine Möglichkeit zu finden, Nhibernate den Sammlungswert zu aktualisieren.

Ich habe versucht, aktualisieren, vertreiben, Laden ... Nur die Sitzung zu schließen und eine neue zu erstellen funktioniert. Aber ich finde diese Lösung problematisch und wie schwer kann es sein, nhibernate "Kumpel, aktualisieren Sie die Elemente in der Sammlung"?

Aber irgendwie kann ich es nicht funktionieren.

Vielen Dank

+0

Sind evicting Sie die Eltern oder das Kind? –

+0

yesssssssssssss. Funktioniert nur, wenn die Sitzung selbst eine Chance gegeben hat. Nicht wenn Änderungen in der Datenbank auf andere Weise vorgenommen wurden –

+0

Verwenden Sie den 2nd Level Cache? – csanchez

Antwort

1

Dies ist nicht wirklich funktionieren soll, deshalb ist es nicht.

NHibernate verwendet standardmäßig einen Cache auf Sitzungsebene, um Lesevorgänge zu optimieren und Änderungen nachzuverfolgen.

Es hört sich so an, als ob Sie keine korrekte Arbeitseinheit um Ihren Datenzugriff verwenden, da Ihre Sitzungen nur eingeschränkt und nur dann verwendet werden sollten, wenn Sie sie benötigen.

Wenn dies Teil einer Web-App ist, wird empfohlen, dass Sie einem "Session-pro-Request" -Ansatz folgen.

Wenn Sie wirklich wollten, dass dies funktioniert, könnten Sie wahrscheinlich Entität und ihre Kinder aus der Sitzung vertreiben und ein erneutes Abrufen erzwingen, aber das ist eklig und ich würde es wirklich nicht empfehlen.

+0

Ich stimme der Gemeinheit zu. Aber NH ist wirklich cool und die Jungs dahinter sind scharf und schlau. Ich glaube nicht, dass sie das so beabsichtigt haben. –

+0

Das Entfernen der Entität funktioniert nicht! Versuchte das. Das lässt mir keine andere Wahl, als Sammlungsgegenstände eins nach dem anderen zu vertreiben. Böse, wie du gesagt hast. Nebenbei bemerkt, es ist eine Desktop-App und einige Objekte leben lange. –

+0

Auch als Desktop-App müssen Sie Ihre Arbeitseinheit berechnen. Wenn es sich um zwischengespeicherte Daten handelt, trennen Sie die Objekte von der Sitzung und holen Sie sie erneut, wenn Sie eine Aktualisierung durchführen müssen. Andernfalls haben mehrere Clients Schreibkonflikte basierend auf veralteten Daten. – DavidWhitney

0

Nachdem er sich die Mühe gemacht hatte, zu vertreiben, und sogar in Betracht zog, Sitzungen zu öffnen und zu schließen. Es scheint, als ob in Ihrem Code genügend Headspace vorhanden ist, um ein gefiltertes get zu berücksichtigen, d. H., Alle Elemente des Auflistungstyps erhalten, bei denen die übergeordnete ID die des übergeordneten Objekts ist. Je nachdem, wie Sie mit NH arbeiten, müssen Sie möglicherweise Ihr Repository oder Dao erweitern, aber wie andere bereits gesagt haben, ist es ohne ein Beispiel schwierig, genauer zu sein. Der wichtigste Punkt ist, dass Sie die untergeordneten Objekte in einer Abfrage für diesen Typ abrufen, gefiltert nach der übergeordneten ID.

Dies wäre ein neues get, also würden Sie neue oder geänderte Objekte erhalten, die von einem anderen Prozess erstellt wurden, und dann könnten Sie diese Sammlung als Sammlung in Ihrem übergeordneten Objekt festlegen. NH sollte darüber hinwegkommen, wenn Sie versuchen, zu speichern, da es Annahmen über Ihre Objekte treffen und speichern oder aktualisieren kann. Dies könnte für Sie nützlich sein, wenn zwischen dem Abrufen des übergeordneten Objekts und dem erneuten Speichern wahrscheinlich eine gewisse Zeitverzögerung besteht.

Problem bei diesem Ansatz ist, dass eine Art von Merge-Typ-Operation erforderlich ist. Möglicherweise möchten Sie neue Objekte hinzufügen, die in Prozess erstellt wurden, damit Sie Ihre Änderungen nicht verlieren, wenn die Auflistung aktualisiert wird. Hoffe, das hilft, gib uns ein paar Infos, wenn du noch feststeckst.

+0

Danke! Aber ich denke, dass Sie die Schönheit und Praktikabilität von NH verlieren, wenn Sie die coolen Out of the Box-Kollektionen durch gefilterte Gets ersetzen. –

0

Sie sollten die IDispose-Schnittstelle in Ihrer SessionFactory-Klasse implementieren.

Genau wie folgt aus:

public class YouSessionFactory : INHibernateSessionFactory, IDisposable 
{ 
    private ISessionFactory _sessionFactory; 

    //codes for initial _sessionFactory, for configuration,mapping or something else. 
    //balalalalalala 
    //.... 

    public ISessionFactory BuildSessionFactory() 
    { 
     return _sessionFactory; 
    } 

    public void Dispose() 
    { 
     if (!_sessionFactory.IsClosed || _sessionFactory != null) 
     { 
      _sessionFactory.Close(); 
      _sessionFactory.Dispose(); 
     } 
    } 
} 
Verwandte Themen