Обновление объекта Db4o
-
21-09-2019 - |
Вопрос
Я использую 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 каким-либо особым образом?обернуть это в вызовы фиксации?Спасибо
Решение
На самом деле, предполагается, что это работает именно так.Вы должны иметь в виду, что вы манипулируете объектами, а не только данными.
При сохранении (или запросе) объекта к объектной базе данных (или из нее) сохраняется связь между сохраненными данными и объектом в памяти.Это необходимо, когда вы обновляете объект и сохраняете его в базе данных.На самом деле вы не хотите, чтобы сохранялся новый объект, но вы хотите, чтобы старый объект был обновлен.Таким образом, при извлечении объекта, который все еще существует в памяти, вам будет предоставлена ссылка на этот объект.
Другая причина - целостность данных.Посмотрите на свой код еще раз и представьте, что он выдает вам данные базы данных, а не ссылку на обновленный объект:
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) ваши данные всегда непротиворечивы, поскольку у вас есть только один объект (на который ссылаются два раза).