我通过使用“DeletedDate”属性来删除实体。这些实体从服务器返回,因此可以从其他用户的Breeze缓存中删除它们。分离软删除实体的正确方法是什么?
我尝试过的一种方法是观察实体更改,如果它有DeletedDate则将其分离:
// Mark soft-deleted entities as detached
manager.entityChanged.subscribe(function (args) {
if (args && args.entity && args.entity.DeletedDate) {
args.entity.entityAspect.setDetached();
}
});
这种方法的问题在于,当Breeze仍在构建关系时会发生这种情况,因此分离的实体仍可能与其他对象相关联。例如,detachedEntity.Relationship1 = null(正确的行为),但detachedEntity.Relationship2!= null(不正确的行为)和detachedEntity.Relationship2.RelatedEntities包含detachedEntity(不正确的行为。)
我正在寻找一种解决方案,我可以正确地分离这些实体,并在传递结果之前将其从关系中删除。有什么想法吗?
示例:
我修改了Todo Angular样本以证明问题。我添加了一个与TodoItem具有多对多关系的Category实体。实体TodoItemCategory充当实体之间的映射表。每个实体上的DeletedDate属性表示软删除。
在示例中,“基本需求”类别被软删除。所有用户都将收到此实体,以防它在缓存中并需要清理。当我在entityChanged事件期间分离它时,它的一些关系不会被删除。正确的行为是要删除关系。
如何在传递查询结果之前检测到软删除的实体并将其正确分离?
答案 0 :(得分:0)
根据我过去收集的内容,我相信setDetached几乎不是你实际想要的方向。
如果我是你,那么我要指的是设置deletedDate属性,并且在保存集成功时将其删除并接受更改客户端这样的内容 -
function deleteMe(me) {
// Save changes only to the me entity
manager.saveChanges([me]).then(success);
function success(data) {
me.entityAspect.setDeleted();
me.entityAspect.acceptChanges();
}
}
这应该将实体设置为已删除并删除它以及它与其他实体的关系,然后acceptChanges应将其从管理器中分离。