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

时间:2014-06-27 21:32:00

标签: breeze

我通过使用方法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;
            }
        }

此外,如何加载navigation property有一些限制。出于性能原因,我不想立即获取导航属性的所有记录。

2 个答案:

答案 0 :(得分:2)

您可以使用EntityQuery.fromEntityNavigation方法构建基于实体 navigationProperty 的查询。从那里,您可以通过EntityManager.executeQueryLocally方法在本地执行生成的查询。所以在你的例子中,一旦你有一个项目'您可以执行以下操作的实体。

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

query = query.using(FetchStrategy.FromServer);    

答案 1 :(得分:0)

请看一下:http://www.breezejs.com/sites/all/apidocs/classes/EntityManager.html 正如你所看到的,fetchEntityByKey(typeName keyValues checkLocalCacheFirst)也有第三个可选参数,你可以用它来告诉breeze首先检查该实体的管理器缓存

希望这会有所帮助