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包