如何从breeze缓存中删除软删除的实体?

时间:2014-05-24 13:25:59

标签: breeze

我通过使用“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事件期间分离它时,它的一些关系不会被删除。正确的行为是要删除关系。

如何在传递查询结果之前检测到软删除的实体并将其正确分离?

Download example

1 个答案:

答案 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应将其从管理器中分离。