Frage

Ich bin mit db4o für eine einfache Anwendung, mit einem eingebetteten db. Wenn ich ein Objekt speichern, und dann das Objekt ändern, ist es, dass db4o kehrt das geänderte Objekt annehmen?

Hier ist der Code:

[Test]
    public void NonReferenceTest()
    {
      Aim localAim = new Aim("local description", null);
      dao.Save(localAim);

      // changing the local value should not alter what we put into the dao
      localAim.Description = "changed the description";

      IQueryable<Aim> aims = dao.FindAll();

      var localAim2 = new Aim("local description", null);
      Assert.AreEqual(localAim2, aims.First());
    }

Der Test schlägt fehl. Brauche ich den db4o Behälter in einer besonderen Art und Weise zu installieren? wickeln Sie es begehen Anrufe in? Dank

War es hilfreich?

Lösung

Eigentlich wird angenommen, dass Art und Weise zu arbeiten. Sie müssen bedenken, dass Sie Objekte nicht nur Daten zu manipulieren.

Bei der Lagerung (oder Abfrage), um ein Objekt zu (oder von) die Objekt-Datenbank, hält sie die Verknüpfung zwischen den gespeicherten Daten und dem Objekt im Speicher. Das ist erforderlich, wenn Sie das Objekt aktualisieren und speichern sie in der Datenbank. Sie wollen eigentlich nicht, dass ein neues Objekt gespeichert ist, aber Sie wollen das alte Objekt aktualisiert werden. Also, wenn ein Objekt abzurufen, die noch im Speicher vorhanden ist, erhalten Sie eine Referenz auf das Objekt gegeben werden.

Ein weiterer Grund ist die Datenintegrität. Betrachten Sie Ihren Code wieder, und sich vorstellen, es Ihnen die Daten der Datenbank gibt und nicht einen Verweis auf das aktualisierte Objekt:

Aim localAim = new Aim("local description", null);
dao.Save(localAim);

// changing the local value should not alter what we put into the dao
localAim.Description = "changed the description";

IQueryable<Aim> aims = dao.FindAll();

var localAim2 = aims.First();

// Assuption A: localAim2 != localAim
localAim2.Description += " added s/t";

dao.Save(localAim); 
// with Assuption A you now have "changed the description" in database
dao.Save(localAim2);
// with Assuption A you now have "local description added s/t"

Das Problem mit Assuption A (localAim2! = LocalAim) ist, dass man auf dem gleichen Objekt arbeiten, die in der Datenbank mit zwei unterschiedlichen Inhalten gespeichert. Ohne Assuption A (das heißt localAim2 == localAim), Ihre Daten sind immer konsistent, da Sie nur ein Objekt (bezogen zweimal) haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top