Breeze在使用MergeStrategy.OverwriteChanges时不更新我的列表

Breeze在使用MergeStrategy.OverwriteChanges时不更新我的列表,breeze,Breeze,我有以下代码: breeze.EntityQuery.from(endpoint) .withParameters(withParameters) .toType(entity) .using(breeze.MergeStrategy.OverwriteChanges) .noTracking(false) .using(manager) .execute() .then(_extractResponseResult) .catch

我有以下代码:

breeze.EntityQuery.from(endpoint)
    .withParameters(withParameters)
    .toType(entity)
    .using(breeze.MergeStrategy.OverwriteChanges)
    .noTracking(false)
    .using(manager)
    .execute()
    .then(_extractResponseResult)
    .catch(_doSomethingElse);

function _extractResponseResult(response) {
    console.log(">>. results: ", results);

    return results;
}
结果如下所示:

Myitem {
  entityAspect : {...},
  name : 'item name',
  lists : Array[1]
}
addType({
name: 'MyEntity',
dataProperties: {
    id: {nullOk: false, isPartOfKey: true},
    name: {}
},
navigationProperties: {
    lists: {
        hasMany: true,
        entityTypeName: 'MyList',
        associationName: 'Foo_MyList'
    }
}
});
每当我执行
breeze.EntityQuery.from()
方法时,它总是返回一个未更新的列表。这真的开始让我生气了。如何确保它已更新?就像后端清除列表时,不应该有任何列表,但是当我执行
breeze.EntityQuery.from()
时,列表仍然存在,即使愚蠢的网络控制台说,“哦,列表是空的”,所以breeze响应上的列表应该是空的,但我看了看,它不是空的。除列表中的属性外,所有其他属性都将更新

我的元数据如下所示:

Myitem {
  entityAspect : {...},
  name : 'item name',
  lists : Array[1]
}
addType({
name: 'MyEntity',
dataProperties: {
    id: {nullOk: false, isPartOfKey: true},
    name: {}
},
navigationProperties: {
    lists: {
        hasMany: true,
        entityTypeName: 'MyList',
        associationName: 'Foo_MyList'
    }
}
});

我尝试按照建议清除缓存,但不幸的是,我的列表实际上显示在同一页面上屏幕的另一部分(用户只是通过复选框将列表作为MyItem的一部分),并且执行分离操作时,也会删除屏幕上的列表,因为它们毕竟是相同的实体,相同的id,这不是我想要做的。

处理服务器端删除基本上是一个缓存一致性问题,也是一个重要问题

在这种情况下,您可能能够使用返回的数据对象的属性来通知客户机列表中的哪些项已被返回

在下面的示例中,我假设查询返回一个MyItem实体,其所有MyList对象都包含(展开)在服务器响应中。retrievedEntities列表将包含所有MyList实体,因此如果缺少一个,我们假设它已在服务器上删除

manager.executeQuery(query).then(function (data) {
    var myItem = data.results[0];
    var retrieved = data.retrievedEntities;
    myItem.lists.forEach(function (myList) {
        if (retrieved.indexOf(myList) < 0) {
            // already deleted on the server
            myList.entityAspect.setDetached();
        }
    })
    return myItem;
});
manager.executeQuery.then(函数(数据){
var myItem=data.results[0];
检索到的var=data.retrievedEntities;
myItem.lists.forEach(函数(myList){
if(检索到的索引of(myList)<0){
//已在服务器上删除
myList.entityAspect.setDistached();
}
})
归还我的物品;
});

处理服务器端删除基本上是一种缓存一致性,是一种安全性。