2009-09-04 128 views
1

我正在使用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容器吗?将它包装在提交调用中?由于

回答

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个不同的内容存储在数据库中。 如果没有Assuption A(即localAim2 == localAim),您的数据总是一致的,因为您只有一个对象(引用两次)。