我通过使用方法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
有一些限制。出于性能原因,我不想立即获取导航属性的所有记录。
答案 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首先检查该实体的管理器缓存
希望这会有所帮助