首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Db4o对象更新

Db4o对象更新
EN

Stack Overflow用户
提问于 2009-09-04 19:48:51
回答 1查看 1.4K关注 0票数 1

我用db4o做了一个简单的应用程序,有一个嵌入的数据库。当我保存一个对象,然后更改该对象时,会假设db4o返回更改后的对象吗?

代码如下:

代码语言:javascript
复制
[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容器吗?是否将其包装在提交调用中?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-10 17:36:02

实际上,它应该是这样工作的。您必须记住,您正在操作对象,而不仅仅是数据。

当在对象数据库中存储(或查询)对象时,它将存储的数据与内存中的对象保持链接。当您更新对象并将其存储在数据库中时,这是必需的。您实际上不希望存储新对象,但希望更新旧对象。因此,当检索仍然存在于内存中的对象时,您将获得对该对象的引用。

另一个原因是数据完整性。再看看你的代码,想象一下它给了你数据库的数据,而不是对更新后的对象的引用:

代码语言:javascript
复制
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)的问题是,您使用两个不同的内容处理存储在数据库中的同一对象。如果没有Assuption A(即localAim2 == localAim),您的数据总是一致的,因为您只有一个对象(引用两次)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1381213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档