Обновление объекта Db4o

Я использую db4o для простого приложения со встроенной базой данных. Когда я сохраняю объект, а затем изменяю его, предполагается ли, что db4o возвращает измененный объект?

Вот код:

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

Тест не проходит. Нужно ли каким-то особым образом настраивать контейнер db4o? обернуть его в вызовы фиксации? Спасибо


person Miguel Ping    schedule 04.09.2009    source источник


Ответы (1)


Собственно, так и должно работать. Вы должны иметь в виду, что вы манипулируете объектами, а не только данными.

При сохранении (или запросе) объекта в (или из) базы данных объектов он сохраняет связь между сохраненными данными и объектом в памяти. Это необходимо, когда вы обновляете объект и сохраняете его в базе данных. На самом деле вы не хотите, чтобы новый объект сохранялся, но вы хотите, чтобы старый объект обновлялся. Итак, при извлечении объекта, который все еще существует в памяти, вам будет дана ссылка на этот объект.

Другая причина — целостность данных. Посмотрите еще раз на свой код и представьте, что он дает вам данные базы данных, а не ссылку на обновленный объект:

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"

Проблема с предположением A (localAim2 != localAim) заключается в том, что вы работаете с одним и тем же объектом, который хранится в базе данных с двумя разными содержимыми. Без предположения A (т. е. localAim2 == localAim) ваши данные всегда согласуются, поскольку у вас есть только один объект (на который ссылаются два раза).

person mr_georg    schedule 10.09.2009