Breeze:Metadata.isEmpty()未按预期工作
我有以下方法:Breeze:Metadata.isEmpty()未按预期工作,breeze,Breeze,我有以下方法: function _getById(entityName, id, navigationProperty) { var self = this; var manager = self.manager; if (manager.metadataStore.isEmpty()) { return manager.fetchMetadata().then(function () {
function _getById(entityName, id, navigationProperty) {
var self = this;
var manager = self.manager;
if (manager.metadataStore.isEmpty()) {
return manager.fetchMetadata().then(function () {
var entityType = manager.metadataStore.getEntityType(entityName);
var entityKey = new EntityKey(entityType, id);
return EntityQuery.fromEntityKey(entityKey)
.expand(navigationProperty)
.using(manager)
.execute()
.to$q(querySucceeded);
});
}
else {
var entityType = manager.metadataStore.getEntityType(entityName);
var entityKey = new EntityKey(entityType, id);
return EntityQuery.fromEntityKey(entityKey)
.expand(navigationProperty)
.using(manager)
.execute()
.to$q(querySucceeded);
}
function querySucceeded(data) {
return data;
}
}
如果我通过应用程序导航到该页面,这可以正常工作,但是,如果我直接加载该页面,则会出现以下错误:
Unable to locate a 'Type' by the name: 'Customer'. Be sure to execute a query
or call fetchMetadata first.
在代码中,它似乎转到了我的if
语句的else
部分,这意味着元数据存储不是空的,但从错误来看,它似乎是空的?我做错了什么
编辑
我做了一些更改,但仍然得到相同的结果:
function _getById(entityName, id) {
var self = this;
var manager = self.manager;
if (!manager.metadataStore.hasMetadataFor('breeze/ax')) {
return manager.fetchMetadata()
.then(_getEntityById(manager, entityName, id));
}
else {
return $q.when(_getEntityById(manager, entityName, id));
}
}
function _getEntityById(manager, entityName) {
var entityType = manager.metadataStore.getEntityType(entityName);
var entityKey = new EntityKey(entityType, id);
return EntityQuery.fromEntityKey(entityKey)
.using(manager)
.execute()
.to$q(querySucceeded);
function querySucceeded(data) {
var entity = data.results[0];
return entity;
}
}
我以前碰到过这个。问题是,;当您直接加载页面时,它会在抓取元数据的调用完成之前加载..(我假设您使用的是
DurandalJS
)
我所做的是在激活路由器之前,在shell视图中调用方法fetchMetadata()
因此,在shell视图中的activate方法中,您的代码可能如下所示:
function activate() {
return manager.fetchMetadata()
.then(boot)
.fail(failedInitialization);
}
function boot() {
return router.map(routes) // routes is our array of routes
.buildNavigationModel()
.activate();
}
在这种情况下,您不必检查元数据的状态,因为它将在加载应用程序和
元数据存储之前被调用。hasMetadataFor
将始终返回false。我不确定是否理解这两种情况,但请在失败之前查看您的元数据存储,它显然有一些东西在里面。第一个场景是加载元数据,如果它是空的,因为manager.metadataStore.getEntityType
要求在使用元数据之前加载元数据。因此,我首先检查元数据存储是否为空,如果为空,那么我将获取它。无需这样做,FetchMetadata调用会在内部执行此操作。如果它曾经为特定的数据服务请求过元数据,它将避免再次访问服务器,只返回缓存的元数据。如果我直接加载一个调用.getEntityType
的页面,那么它将抛出元数据未加载的错误,因此如果该页面为空,我将使用fetchMetadata
将其包装,否则,我会用一个承诺来包装它。我只会始终调用“fetchMetadata”,如果元数据已经被获取,它将立即解析。注意:您还可以使用第二个参数true调用“getEntityType”以抑制异常,即“getEntityType(typeName,true)”。看,我实际上使用的是Angular,特别是hottower.Angular.Breeze nuget包