Breezejs EntityManager MetadataStore和fetchEntityByKey

Jon*_*ora 5 breeze durandal

我有一个SPA应用程序(durandaljs),我有一个特定的路由,我映射我想要获取的实体的"id".

模板是"/#/ todoDetail /:id".

例如,"/#/ todoDetail/232"或"/#/ todoDetail/19".

在viewmodel的激活功能上,我得到了路由信息,所以我可以获取id.然后我创建了一个breezejs EntityManager的新实例来获取具有给定id的实体.

问题是当我调用manager.fetchEntityByKey("Todos",id)时,EntityManager还没有来自服务器的元数据,所以它抛出异常"无法通过名称找到'Type':Todos".

只有在调用fetchEntityByKey之前首先对存储(manager.executeQuery)执行查询时,它才有效.

这是预期的行为还是错误?在实例化EntityManager期间有没有办法自动生成元数据?

注意:我认为在我的情况下很难使用共享的EntityManager,因为我想允许用户直接在浏览器上键入路由.

编辑:作为临时解决方法,我这样做:

BreezeService.prototype.get = function (id, callback) {
    var self = this;

    function queryFailed(error) {
        app.showMessage(error.message);
        callback({});
    }

    /* first checking if metadatastore was already loaded */

    if (self.manager.metadataStore.isEmpty()) {
        return self.manager.fetchMetadata()
        .then(function (rawMetadata) {
            return executeQuery();
        }).fail(queryFailed);
    } else {
        return executeQuery();
    }

    /* Now I can fetch */
    function executeQuery() {
        return self.manager.fetchEntityByKey(self.entityType, id, true)
                        .then(callback)
                        .fail(queryFailed);
    }
};
Run Code Online (Sandbox Code Playgroud)

War*_*ard 7

你已经了解了fetchMetadata.这很重要.如果应用程序可以在不发出查询的情况下开始,则必须先使用fetchMetadata并等待它返回,然后才能直接在缓存上执行任何操作(例如,在返回数据库查询之前通过缓存中的键检查实体) .

但是我感觉到其他事情正在发生,因为你提到了多个经理.默认情况下,新管理员不知道来自任何其他经理的元数据.但是你知道你可以在经理之间共享一个metadataStore吗?您可以.

我经常做的(你会在DocCode示例中的元数据测试中看到它)是获取应用程序的metadataStore,编写一个EntityManager工厂函数,用这个metadataStore创建新的管理器,然后每当我使用工厂时我正在制作新的经理......当你启动ViewModel审查TodoDetail时,你似乎正在做的事情.