我对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(...)
)
答案 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
});