2017-07-09 2 views
1

ich mit NHibernate Objekte wie unten entfernen:Revert eine gelöschte Instanz in NHibernate Sitzung

var obj = session.Get<MyModel>(some_guid); 
session.Delete(obj); 

Das Objekt ist nun vorübergehend und MyModel Objekt mit der ID some_guid als gelöschtes Objekt in NHibernate Sitzung Liste steht.

Später in mein Vermächtnis app, muss ich die Streichung von einigeObjekte in der Sitzung gelöscht abzubrechen. Ich habe versucht, Abhilfe unten hatte aber kein Glück:

var e = ((SessionImpl)session).PersistenceContext.EntityEntries; 
var allEntities = e.Keys.Cast<object>().ToList(); 
var item = allEntities.FirstOrDefault(c => c.Id == some_guid); 
session.Refresh(item); // throw an exception 

Die obige Abhilfe wird eine Ausnahme nhibernate instance was not in a valid state

Antwort

0

Das Unternehmen Löschung wird in einer Aktion Warteschlange aufgenommen, die durch die gesamte Sitzung Clearing abgebrochen werden kann nur werfen (ISession.Clear) .

Sie können nicht erreichen, was Sie suchen. NHibernate unterstützt Ihr Szenario nicht, indem einige ausstehende Änderungen in einer Sitzung abgebrochen werden, andere jedoch nicht.

Sie könnten versucht haben, ISession.Evict, aber das verursacht einen Fehler auf Flush, weil die Aktion Warteschlange hat dann auf eine Entität im Sitzung Persistenzkontext fehlt. (Es ergibt sich eine Ausnahme raten eine Thread-Nutzung wurde versucht, aber gut, nein, nur eine Evict auf eine Entität mit ausstehenden Aktionen.)

Sie müssen Ihre Anwendung ändern, um zu vermeiden, dass es Objekte löschen, die nicht gelöscht werden sollten den ersten Platz.

Oder wenn einige Objekte, die in der Sitzung gelöscht wurden, nicht gelöscht werden sollen, brechen Sie die gesamte Sitzung ab (Rollback der Transaktion, entsorgen Sie die Sitzung, verwenden Sie eine neue) und wiederholen Sie die Arbeit, ohne Objekte zu löschen . (Wenn Sie nicht über eine Transaktion verwenden, kann FlushMode.Auto Löschungen spülen, bevor Sie die Sitzung Clear.)

Oder im schlimmsten Fall, halten Sie eine Kopie Ihrer Objekte, begehen die Sitzung, und erneut speichern sie ...