Breeze-如何从缓存加载导航属性

Breeze-如何从缓存加载导航属性,breeze,Breeze,我使用方法fetchEntityByKey获取单个实体,然后通过entityAspect.loadNavigationProperty加载实体的导航属性。但是loadNavigationProperty总是调用服务器,我想知道的是我是否可以首先从缓存中检查它,如果它存在,然后从那里获取它,否则就转到服务器。怎么可能呢?这是我目前的代码 return datacontext.getProjectById(projectId) .then(function (data) {

我使用方法
fetchEntityByKey
获取单个实体,然后通过
entityAspect.loadNavigationProperty
加载实体的导航属性。但是
loadNavigationProperty
总是调用服务器,我想知道的是我是否可以首先从缓存中检查它,如果它存在,然后从那里获取它,否则就转到服务器。怎么可能呢?这是我目前的代码

  return datacontext.getProjectById(projectId)
        .then(function (data) {

             vm.project = data;
             vm.project.entityAspect.loadNavigationProperty('messages');
 });
下面是一个我封装在
datacontext
服务中的函数

 function getProjectById(projectId) {

            return manager.fetchEntityByKey('Project', projectId)
                .then(querySucceeded, _queryFailed);

            function querySucceeded(data) {

                return data.entity;
            }
        }
此外,如何能够加载具有一定限制的
导航属性
。出于性能原因,我不希望同时拥有导航属性的所有记录。

请查看此处: 正如您所看到的,fetchEntityByKey(typeName keyValues checkLocalCacheFirst)还有第三个可选参数,您可以使用它告诉breeze首先检查该实体的管理器缓存


希望这有帮助

您可以使用EntityQuery.fromEntityNavigation方法基于实体和导航属性构建查询。从那里,您可以通过EntityManager.ExecuteQueryLocal方法在本地执行生成的查询。因此,在您的示例中,一旦有了“项目”实体,您就可以执行以下操作

var messagesNavProp = project.entityType.getProperty("messages");
var query = EntityQuery.fromEntityNavigation(project, messagesNavProp);
var messages = myEntityManager.executeQueryLocally(query);
您还可以使用EntityQuery.using方法在远程执行和本地执行之间切换查询,如下所示:

query = query.using(FetchStrategy.FromLocalCache);
vs


我说的是从缓存中获取导航属性,我已经完成了“fetchEntityByKey”及其缓存的处理。对此有什么建议吗?您仍然可以使用它来获取导航属性,也可以使用ExecuteQueryLocary来查询manager缓存,并且这些查询是为调用方异步构造的,无论查询实际上是针对缓存的同步查询还是针对服务器的异步查询。
query = query.using(FetchStrategy.FromServer);