Pergunta

Estou usando o DB4O para um aplicativo simples, com um banco de dados incorporado. Quando salvo um objeto e alterado o objeto, suponha que o DB4O retorne o objeto alterado?

Aqui está o 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());
    }

O teste falha. Preciso configurar o contêiner DB4O de alguma maneira especial? Enrole -o em chamadas de confirmação? Obrigado

Foi útil?

Solução

Na verdade, deve funcionar dessa maneira. Você deve ter em mente que está manipulando objetos não apenas dados.

Ao armazenar (ou consultar) um objeto para (ou de) o objeto-Database, ele mantém o link entre os dados armazenados e o objeto na memória. Isso é necessário quando você atualiza o objeto e o armazena no banco de dados. Na verdade, você não deseja que um novo objeto seja armazenado, mas deseja que o objeto antigo seja atualizado. Portanto, ao recuperar um objeto que ainda existe na memória, você receberá uma referência a esse objeto.

Outro motivo é a integridade dos dados. Veja o seu código novamente e imagine que ele fornece os dados do banco de dados e não uma referência ao objeto atualizado:

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"

O problema com a Assução A (LocaAIM2! = LocaAIM) é que você trabalha no mesmo objeto que é armazenado no banco de dados com 2 conteúdos diferentes. Sem a Assução A (ou seja, LocaAIM2 == LocaAIM), seus dados são sempre consistentes, pois você tem apenas um objeto (referenciado duas vezes).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top