Breeze 针对无效api路由的fetchEntityByKey查询

Breeze 针对无效api路由的fetchEntityByKey查询,breeze,Breeze,我的实体名称是“Products”,但在我的WebApi中,路由被定义为“GetProducts”,因此默认情况下它将查询/api/Products?如果在缓存中找不到所需的内容,是否有任何方法可以代替/api/GetProducts来指定从服务器获取数据的位置 到目前为止,我得到了这个 manager.fetchEntityByKey("Products", productId, true) .then(fetchSucceeded) .fail(queryFailed);

我的实体名称是“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
相反

您可以为给定的实体类型设置资源,该实体类型将命中资源-

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

但值得注意的是,将实体命名为
Products
而不是
Product
似乎是一个设计缺陷

您可以为给定的实体类型设置资源,而该实体类型将命中资源-

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

但值得注意的是,将实体命名为
Products
而不是
Product
似乎是一个设计缺陷

还有另一个选项可以在服务器上指定此选项。使用WebApi 2,您可以在控制器操作上使用RouteAttribute自定义路由

编辑:

在客户端上,Breeze EntityType有一个名为defaultResourceName的属性,您还可以修改该属性,以便在仅指定实体类型名称的情况下告诉Breeze使用哪个默认资源名称

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

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

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

编辑:

在客户端上,Breeze EntityType有一个名为defaultResourceName的属性,您还可以修改该属性,以便在仅指定实体类型名称的情况下告诉Breeze使用哪个默认资源名称

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

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

您可以使用以下命令更改实体的默认resourceName(即访问breeze webapi方法名称)

但请确保在解析manager.fetchMetadata()承诺时执行上述代码:

manager.fetchMetadata().then(function(){
    manager.metadataStore.setEntityTypeForResourceName(...);
})
如果在加载元数据之前调用了
setEntityTypeForResourceName
,则会出现错误,即

找不到:产品的“entityTypeName”


您可以使用以下命令更改实体的默认resourceName(即访问breeze webapi方法名称)

但请确保在解析manager.fetchMetadata()承诺时执行上述代码:

manager.fetchMetadata().then(function(){
    manager.metadataStore.setEntityTypeForResourceName(...);
})
如果在加载元数据之前调用了
setEntityTypeForResourceName
,则会出现错误,即

找不到:产品的“entityTypeName”


它是实体框架复数:),如果可行,我会尝试你的解决方案我会选择它作为正确答案。它给我一个错误entityTypeName找不到它是说找不到类型产品的entityTypeName还是其他什么?您确定在尝试设置资源之前调用了元数据吗?是的,我调用了manager.metadataStore.setEntityTypeForResourceName('GetProducts','Products');inside.then()没关系,不用麻烦你自己,我要改变我的Api路由以匹配breeze约定,而不是发明轮子。这是实体框架的多元化:),我会尝试你的解决方案,如果它有效,我会选择它作为正确答案。它给我一个错误entityTypeName找不到它是说找不到类型产品的entityTypeName还是其他什么?您确定在尝试设置资源之前调用了元数据吗?是的,我调用了manager.metadataStore.setEntityTypeForResourceName('GetProducts','Products');inside.then()没关系,不要打扰你自己,我要改变我的Api路由以匹配breeze约定,而不是发明轮子。问题是我使用路由属性提供我想要的任何路由,而breeze却在抱怨它的约定。哦,对不起,我误解了你的问题。答案修改。问题是我使用路线属性给出了我想要的任何路线,而breeze却在抱怨它的惯例。哦,对不起,我误解了你的问题。答案修改。其他两个答案事实上是正确的工作,但他们没有这样详细,所以我会接受这一个,抱歉,伙计们,但我还不能评分,当我可以的时候,我也会评分其他两个答案。其他两个答案事实上是正确的工作,但他们没有这样详细,所以我会接受这一个,对不起,伙计们,我还不能评分,当我可以的时候,我会给另外两个答案评分。