db4o对象更新困境

时间:2010-02-26 11:11:07

标签: db4o

我是db4o的新手。

我有这个问题: 当从DAL检索对象时,它可能会在Business层中更新,然后我们丢失了它的原始属性,所以在更新时如何找到数据库中的原始对象要更新?< / p>

2 个答案:

答案 0 :(得分:2)

您应该通过其ID加载对象:

objectContainer.get().ext().getByID(id);

或通过其UUID:

objectContainer.get().ext().getByUUID(uuId);

See the docs为后者。有关说明,请参阅答案here或文档here。简而言之,只使用uuid进行长期参考。

答案 1 :(得分:2)

您需要更准确地了解“对象”。如果修改对象实例的属性,只需再次存储它将执行更新:

MyClass someInstance = ObjectContainer.Query<MyClass>().FirstOrDefault();
someInstance.Name = "NewName";
someInstance.PhoneNumber = 12132434;
ObjectContainer.Store(someInstance); // This is the update call

[这只是伪代码]

因此,您不需要像使用RDBMS时那样将对象彼此匹配。

但是,您需要确保没有使用ObjectContainer的其他实例,因为不同的容器不会知道这些对象是同一个实例(因为它们中没有ID字段)。

您的应用程序架构应该有助于为大多数工作流程执行此操作,因此实际上应该只有一个IObjectContainer。只有当时间跨度非常长时(例如,您需要在不同的数据库中存储对象的引用并以某种方式处理它),它才会使用UUID。正如您已经指出的那样,这需要将ID存储在其他地方,从而使您的架构变得复杂。

如果您打算创建一个新对象并“覆盖”旧对象,由于可能引用它的其他对象,事情会变得更复杂一些。然而,这是一种病态病例,通常应在域模型本身内处理,例如,通过将对象数据从一个对象复制到另一个对象。