首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BreezeJS意外地混合缓存和服务器数据

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

Stack Overflow用户
提问于 2015-11-09 22:50:46
回答 1查看 80关注 0票数 0

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

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

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

我尝试了一些where谓词,但它们不起作用,也看不出在风的一侧投射有多大的帮助。我想可能它认为查询是相同的,所以它返回缓存的数据作为快捷方式,所以我添加了一个where('Parent.Children', 'any', 'ToyId', 'in', keys),但这不起作用,它仍然带来了取消选择的结果。

我找到的唯一解决这个问题的方法是在进行任何查询之前通过queryManager.clear(),并且我怀疑noTracking查询也可能工作(尽管没有实际的实体对象)。我考虑将keys参数转换为where过滤器,并从那里获取它,而不是keys参数,以防这会告诉Breeze只显示后端数据。

是否有一种“正确”的方法只返回服务器在回调中发送的数据?

(“回调”是指传递给executeQuery.then(...)的函数)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-10 22:58:56

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

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

代码语言:javascript
复制
entityManager.executeQuery(query).then(function(data) {
    var parents = data.results;
    var ret = data.retrievedEntities;
    //... filter ret to get the children
    //... update viewmodel with children
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33619816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档