我使用了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"

与Assuption A(localAim2!= localAim)的问题是,你是存储在数据库中与2个不同的内容相同的对象上工作。 无Assuption A(即,localAim2 == localAim),你的数据是一致的永诺因为只有一个对象(参考两次)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top