【问题标题】:How can I remove soft deleted entities from the breeze cache?如何从微风缓存中删除软删除的实体?
【发布时间】:2014-05-24 13:25:59
【问题描述】:

我正在使用“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

【问题讨论】:

    标签: breeze


    【解决方案1】:

    根据我过去收集到的信息,我相信 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 应该将其与管理器分离。

    【讨论】:

    • 我正在通过覆盖 SaveChanges 然后分离软删除实体来处理服务器端的保存案例,但不是需要从另一个用户的缓存中删除已删除实体的情况。
    • 我没有看到您关于其他用户缓存的任何问题?
    • 编辑第二句澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多