Breeze无法自动获取元数据

时间:2014-04-28 23:20:52

标签: javascript odata breeze wcf-data-services

The Breeze documentation说:

  
    

这个[MetadataStore.FetchMetadata]调用是在Breeze尝试对远程服务执行第一次查询之前自动进行的。

  

但是我打这样的电话:

function getBags() {

    var bags;
    var query = breeze.EntityQuery.from('Bags');

    return manager.executeQuery(query).then(querySucceded, _queryFailed);

    function querySucceded(data) {
        bags = data.result;
        logSuccess("Retrieved Bag Data")
        return bags;
    }
}

function _queryFailed(error) {
    logError(config.appErrorPrefix + "Query Failed: " + error.message);
    throw error;
}

当我这样做时,我收到此错误:

  

"无法找到'类型'名称:' Bag:#DataAccess'。请务必先执行查询或调用fetchMetadata。"

作为error.message_queryFailed的值。

注意:我知道它正在连接到我的OData服务,因为如果我为查询添加了随机内容,我会找不到找到的资源:

  

未找到该细分受众群的资源' Bagsasdfas'。;

我正在使用HotTowel.Angular和HotTowel.Angular.Breeze nuget包。唯一的区别是我直接连接到WCF数据服务(OData)。

在调用查询之前,我确实有这些调用:

breeze.config.initializeAdapterInstances({ dataService: "OData" });
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

任何人都知道为什么Breeze不会自动为此获取元数据?

2 个答案:

答案 0 :(得分:1)

我找到了解决此问题的方法。 Breeze正在获取元数据。

但是Breeze有一个大多数未记录的OData要求,它不是OData规范的一部分:

在元数据中,Schema Namespace(位于元数据顶部)和EntitySet EntityType命名空间(位于EntityContainer下)必须相同。

感谢Brian Noyes的Pluralsight课程,让我知道这一点。

注意:这适用于OData的WCF数据服务版本。对于Web API OData,您的里程可能会有所不同。

通过使包含我的Entity Framework模型的项目与模型(edmx)名称空间具有相同的名称和名称空间,我能够实现这一目标。

您可以通过右键单击设计器并选择属性(命名空间是其中一个属性)来设置edmx的命名空间。

一旦我将项目(及其中的所有文件)从名称“DataAccess”更改为我的edmx名称空间的名称,Breeze就开始正常工作了。

答案 1 :(得分:0)

我已经为Breeze提交了这个错误,它解决了这个问题:

$metadata handling: entity types in separate schema from container not supported #96

我不认为Breeze要求EntityType命名空间与Schema名称空间匹配是正确的 - 我认为这是一个错误。

修复是1行修复,您可以在此处找到: https://github.com/johncrim/breeze.js/commit/9caa76a0de903e08083f600a2a23b9203ef87b49

如果您愿意,可以使用https://github.com/johncrim/breeze.js,它只包含当前breeze.js主机上的补丁。但请注意,它已经落后于Breeze的4个提交:master。