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);