【发布时间】:2010-02-26 11:11:07
【问题描述】:
【问题讨论】:
标签: db4o
【问题讨论】:
标签: db4o
您需要更精确地了解“对象”。如果您修改对象实例的属性,只需再次存储它就会执行更新:
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 存储在其他地方,从而使您的架构变得复杂。
但是,如果您打算创建一个新对象并“覆盖”旧对象,那么由于其他对象可能会引用它,事情会变得更加复杂。然而,这是一个病态的案例,通常应该在域模型本身内处理,例如通过将对象数据从一个对象复制到另一个对象。
【讨论】:
您应该通过其 ID 加载对象:
objectContainer.get().ext().getByID(id);
或通过其 UUID:
objectContainer.get().ext().getByUUID(uuId);
See the docs 用于后者。有关解释,请参阅答案here 或文档here。简而言之,uuid 仅用于长期引用。
【讨论】: