Question

J'utilise db4o pour une application simple, avec un db intégré. Lorsque j'enregistre un objet, puis changer l'objet, est-il supposer que db4o retourne l'objet modifié?

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

Le test échoue. Ai-je besoin de configurer le conteneur db4o d'une manière particulière? l'envelopper dans les appels commettre? Merci

Était-ce utile?

La solution

En fait, il est censé fonctionner de cette façon. Vous devez garder à l'esprit que vous manipulez des objets non seulement les données.

Lors du stockage (ou interrogation) à un objet (ou de) la base de données d'objet, il maintient le lien entre les données stockées et l'objet en mémoire. Ceci est nécessaire lorsque vous mettez à jour l'objet et le stocker dans la base de données. Vous ne voulez pas en fait qu'un nouvel objet est enregistré, mais vous voulez que l'ancien objet à être mis à jour. Ainsi, lors de la récupération d'un objet qui existe encore en mémoire, vous recevrez une référence à cet objet.

Une autre raison est l'intégrité des données. Regardez à nouveau votre code, et imaginez qu'il vous donne les données de la base de données et non une référence à l'objet mis à jour:

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"

Le problème avec Assuption A (localAim2! = LocalAim) est que vous travaillez sur le même objet qui est stocké dans la base de données avec 2 contenus différents. Sans Assuption A (à savoir, localAim2 == localAim), vos données sont AllWays cohérente puisque vous avez un seul objet (deux fois référencés).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top