我对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(...)的函数)
发布于 2015-11-10 22:58:56
正如您已经注意到的,Breeze在调用回调方法之前将查询结果合并到缓存中。这意味着,在回调中,父实体将拥有缓存中存在的其子实体的所有。
查询返回的实体数组在回调中返回的saveResult对象的saveResult属性中可用。您可以使用它来确定从查询中返回了哪些子元素。
entityManager.executeQuery(query).then(function(data) {
var parents = data.results;
var ret = data.retrievedEntities;
//... filter ret to get the children
//... update viewmodel with children
});https://stackoverflow.com/questions/33619816
复制相似问题