2017-08-01 1 views
1

Ich versuche, einen Fehler in einigen Legacy-Code zu beheben. Der Code versucht, ein Objekt (eine Zeile) aus der Datenbank zu löschen. Die Sitzung enthält jedoch manchmal das Objekt nicht und löst eine Ausnahme aus. Ich habe den Test hinzugefügt, um zu sehen, ob die Sitzung das Objekt enthält, und dann verschiedene Dinge versucht, um das Objekt in die Sitzung zu bringen, aber bisher keinen Erfolg. Können Sie mir vorschlagen, was ich noch versuchen kann?Anhängen eines Objekts an eine Sitzung

Dieser Code hat die nHibernate-Sitzung sehr schlecht implementiert, da sie nicht der Arbeitseinheits-Ethik entspricht. Die Anwendung erstellt beim Start eine Sitzung und verwendet diese während der gesamten Lebensdauer der Anwendung. Nichts kann ich dagegen tun (abgesehen von einer kompletten Neuschreibung, in welchem ​​Fall ich sowieso nhibernate aufgeben würde).

using (ITransaction transaction = this.Session.BeginTransaction()) 
{ 
    try 
    { 
     if (Session.Contains(object)) 
     { 
      Session.Delete(object); 
      transaction.Commit(); 
     } 
     else // new code, Session does not contain object 
     { 
      try 
      { 
       //Session.Close(); 
       //Session.Dispose(); 
       //Session.Disconnect(); 
       Session.Merge(object); 
       Session.Save(object); // this does something 
       Session.Lock(object, LockMode.Upgrade); // .Write in invalid mode 
       Session.Update(object); 
       using (ITransaction transaction2 = this.Session.BeginTransaction()) 
       { 
        // this code executes with no error but does not delete the row from the database 
        Session.Delete(object); 
        transaction2.Commit(); 
       } 
      } 
      catch (System.Exception exception) 
      { 
       string message2 = exception.ToString(); 
       MessageBox.Show(message2, "Delete() Try it again ", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
} 
    catch (System.Exception exception) 
    { 
     if (transaction != null) 
     { 
      transaction.Rollback(); 
     } 
     throw exception; 
    } 
} 
+1

Sie könnten versuchen, auf eine andere Weise zu löschen: https://stackoverflow.com/a/25762358/1162077 –

+0

Danke für die Anregung. Dies scheint eine Verbesserung zu sein. Es löscht die Zeile und löst auch eine Ausnahme aus. Aber du kannst das nicht erkennen, etwas Eigenständiges in meinem Code. –

Antwort

0

Warum erhalten Sie das Objekt nicht zuerst aus der Sitzung?

using (ITransaction transaction = Session.BeginTransaction()) 
{ 
    var persisted = Session.Get<SomeType>(object.Id); //object will be loaded if not already in the session 
    Session.Delete(persisted); 
    transaction.Commit(); 
} 
+0

'Get' trifft den Datenbank- oder Session-Cache, um die Entitätsdaten abzurufen. Wenn die Entität existiert, wird sie zurückgegeben. Andernfalls wird 'null' zurückgegeben. –

Verwandte Themen