1

我将 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 容器吗?将其包装在提交调用中?谢谢

4

1 回答 1

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"

Assuption A (localAim2 != localAim) 的问题在于,您处理存储在数据库中的同一个对象,该对象具有 2 个不同的内容。如果没有假设 A(即 localAim2 == localAim),您的数据总是一致的,因为您只有一个对象(引用两次)。

于 2009-09-10T17:36:01.827 回答