Pregunta

Estoy usando db4o para una aplicación sencilla, con un db incrustado. Cuando guardo un objeto, y luego cambiar el objeto, ¿Se supone que db4o devuelve el objeto cambiado?

Aquí está el código:

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

La prueba falla. ¿Es necesario que la configuración del contenedor db4o de alguna manera especial? envolverlo en cometer llamadas? Gracias

¿Fue útil?

Solución

En realidad, se supone que funciona de esa manera. Tienes que tener en cuenta que está manipulando objetos no sólo los datos.

Al almacenar (o consultar) un objeto a (o desde) el objeto-base de datos, se mantiene el enlace entre los datos almacenados y el objeto en la memoria. Esto es necesario para actualizar el objeto y lo almacena en la base de datos. Que en realidad no quiere que un nuevo objeto se almacena, pero desea que el objeto viejo para ser actualizado. Por lo tanto, al recuperar un objeto que todavía existe en la memoria, se le dará una referencia a ese objeto.

Otra razón es la integridad de los datos. Mire su código de nuevo, e imagina que le da los datos de la base de datos y no una referencia al objeto de actualización:

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"

El problema con Assuption A (localAim2! = LocalAim) es que se trabaja en el mismo objeto que se almacena en la base de datos con 2 diferentes contenidos. Sin Assuption A (es decir, localAim2 == localAim), sus datos siempre se encuentra en consonancia ya que tiene sólo un objeto (que se hace referencia dos veces).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top