fetchEntityByKey针对无效的api路由进行查询

时间:2014-04-24 15:00:02

标签: breeze

我的实体名称是“Products”,但在我的WebApi中,路由被定义为“GetProducts”,因此默认情况下它将查询/ api / Products?而不是/ api / GetProducts,是否有任何方法可以指定从服务器获取数据的位置,如果它无法在缓存中找到我想要的内容。

到目前为止我得到了这个

manager.fetchEntityByKey("Products", productId, true)
    .then(fetchSucceeded)
    .fail(queryFailed);

这将调用http://localhost:1990/breeze/Products?$filter=Id%20eq%201

但我希望它改为呼叫http://localhost:1990/breeze/GetProducts?$filter=Id%20eq%201

3 个答案:

答案 0 :(得分:2)

还有另一种选择在服务器上指定它。使用WebApi 2,您可以使用控制器操作上的RouteAttribute来自定义路由。

请参阅http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

编辑:

在客户端上,Breeze EntityType有一个名为defaultResourceName的属性,如果只指定了实体类型名称,您也可以修改它以告诉Breeze使用哪个默认资源名称。

var productType = metadataStore.getEntityType('Products');
productType.defaultResourceName = 'GetProducts';

//Will create fetch request to breeze/GetProducts
manager.fetchEntityByKey('Products', productId);

答案 1 :(得分:1)

您可以为给定实体类型设置资源,而不是命中资源 -

    manager.metadataStore.setEntityTypeForResourceName('GetProducts', 'Products');

但是作为一个注释,为您的实体命名Products而不是Product似乎是一个设计漏洞。

答案 2 :(得分:1)

您可以使用

更改实体的默认resourceName(使用breeze webapi方法名称)
manager.metadataStore.setEntityTypeForResourceName("GetProducts", "Product")

但是,当确认 manager.fetchMetadata()的承诺时,请确保执行上述代码:

manager.fetchMetadata().then(function(){
    manager.metadataStore.setEntityTypeForResourceName(...);
})

如果在加载元数据之前调用setEntityTypeForResourceName,您将收到错误,即

  

无法找到“产品

的'entityTypeName'