我正在使用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容器?将它包装在提交调用中?感谢
答案 0 :(得分: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),你的数据总是一致的,因为你只有一个对象(引用了两次)。