BreezeJS意外混合缓存和服务器数据

时间:2015-11-09 22:50:46

标签: breeze

我对Breeze有一个奇怪的(或至少是意外的)问题。我有一个EF后端视图模型,我发送一些参数,它返回一些数据。我使用withParameters选项来执行此操作。后端执行大量Include和投影,并返回我想要在一组自定义视图模型实体(即,不是数据库实体)中显示的数据。其中一个参数是我想要显示数据的键列表。

密钥标识我要检索的父实体的哪些子项,虽然我正在检索父项列表(例如,键[1,2]意味着它应该获得Parent个实体Children } list属性本身具有ToyId属性,该属性具有键值和Child个值。换句话说,结构就像Parent.Child[]Child.ToyId,我希望让父母带着孩子拥有某些玩具和那些孩子(而不是其他孩子)。父集和子集都很大,所以我在SQL中通过EF(这本身就是冒险)这样做。

无论如何,问题发生在我选择两个键并获取数据然后取消选择其中一个键之后。获取两个键的数据的第一个查询按预期工作。在第二个executeQuery的回调中,我得到与上一个查询相同的数据,这意味着它好像我从未取消选择该密钥。我已经验证Breeze使用正确的keys参数值命中后端,而后端返回只是我想要的数据,但似乎Breeze忽略了来自后端的数据或从后端及其缓存的实体(对于两个键)对结果集执行联合,并将该联合作为results发送到回调而不是服务器返回的内容。这是预期的行为吗?不幸的是,一切都是这样写的。我们(使用Breeze工作,我们的第一个项目)都假设它只返回服务器在不使用executeQueryLocally时发送的内容,因此重构将是一件大事。叹息。

我尝试了一些不起作用的where个谓词,并且没有看到Breeze方面的预测也会有所帮助。我想也许它看到查询是相同的,所以它将缓存的数据作为快捷方式返回,所以我添加了一个where('Parent.Children', 'any', 'ToyId', 'in', keys),但是没有工作,它仍然会带来取消选择的结果。

在我进行任何查询之前,我发现解决此问题的唯一方法是通过queryManager.clear(),我怀疑做noTracking查询也可能有效(尽管没有实际实体)对象)。我考虑过将keys参数转换为where过滤器并从那里获取它而不是keys参数,以防Breeze只显示后端数据。< / p>

是否有正确的&#34;只返回服务器在回调中发送的数据的方法?

(&#34;回调&#34;意思是函数传递到executeQuery.then(...)

1 个答案:

答案 0 :(得分:0)

正如您所注意到的,Breeze在调用您的回调方法之前将查询结果合并到缓存中。这意味着,在回调中,父实体将具有缓存中存在的所有子项。

查询返回的实体数组在回调中返回的saveResult对象的retrievedEntities属性中可用。您可以使用它来确定从查询返回的子项。

entityManager.executeQuery(query).then(function(data) {
    var parents = data.results;
    var ret = data.retrievedEntities;
    //... filter ret to get the children
    //... update viewmodel with children
});