Domanda

sto usando db4o per una semplice applicazione, con un db incorporato. Quando ho salvare un oggetto, e quindi modificare l'oggetto, è che si supponga che db4o restituisce l'oggetto modificato?

Ecco il codice:

[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());
    }

Il test ha esito negativo. Ho bisogno di impostare il contenitore db4o in alcun modo speciale? avvolgerlo in commettere chiamate? Grazie

È stato utile?

Soluzione

In realtà, si suppone di lavorare in questo modo. Bisogna tenere a mente che si stanno manipolando gli oggetti non solo dati.

Nel conservare (o query) un oggetto (o da) l'oggetto database, mantiene il collegamento tra i dati memorizzati e l'oggetto in memoria. Questo è necessario quando si aggiorna l'oggetto e riporlo nel database. In realtà non si desidera che un nuovo oggetto viene memorizzato, ma si desidera che il vecchio oggetto da aggiornare. Così, durante il recupero di un oggetto che esiste ancora in memoria, vi verrà dato un riferimento a tale oggetto.

Un altro motivo è l'integrità dei dati. Guardate il vostro codice di nuovo, e immagino che ti dà i dati del database e non un riferimento all'oggetto aggiornamento:

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"

Il problema con Assuption A (localAim2! = LocalAim) è che si lavora sullo stesso oggetto che viene memorizzato nel database con 2 diversi contenuti. Senza Assuption A (vale a dire, localAim2 == localAim), i dati sono allways coerente poiché avete solo un oggetto (si fa riferimento due volte).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top