Breeze OData:使用GetEntityByKey(EntitySetController)获取单个条目

时间:2013-07-07 13:36:07

标签: asp.net-mvc-4 asp.net-web-api odata breeze

阅读documentation in Breeze website,检索单个实体必须使用fetchEntityByKey

manager.fetchEntityByKey(typeName, id, true)
    .then(successFn)
    .fail(failFn)

问题1:元数据

尝试使用此方法时,会显示错误,因为尚未加载元数据。更多详情about the error here

结果是,每当我需要检索单个实体时,必须检查元数据是否已加载。

manager = new breeze.EntityManager(serviceName);
successFn = function(xhr) {}
failFn = function(xhr) {};
executeQueryFn = function() {
  return manager.fetchEntityByKey(typeName, id, true).then(successFn).fail(failFn);
};
if (manager.metadataStore.isEmpty()) {
  return manager.fetchMetadata().then(executeQueryFn).fail(failFn);
} else {
  return executeQueryFn();
}

问题

如何扩展微风,创建一个Get方法来检查是否加载了元数据,如果没有,加载它?

问题2:OData和EntitySetController

我会在我的API中使用OData标准(带EntitySetControllerThis page in Breeze documentation显示了如何,然后按this tutorial与OData一起部署我的应用。

您可以看到herehere的问题是EntitySetController遵循odata模式,检索实体必须使用odata/entity(id),或者检索全部您可以使用`odata / entity'的实体。

示例

在控制器中:

[BreezeController]
public class passosController : EntitySetController<Passo>
{
    [HttpGet]
    public string Metadata()
    {
        return ContextProvider.Metadata();
    }

    [HttpGet, Queryable(AllowedQueryOptions = AllowedQueryOptions.All, PageSize = 20)]
    public override IQueryable<T> Get()
    {
        return Repositorio.All();
    }   

    [HttpGet]
    protected override T GetEntityByKey(int key)
    {
        return Repositorio.Get(key);
    }    
}

当我使用时:

manager = new breeze.EntityManager("/odata/passos");
manager.fetchEntityByKey("Passo", 1, true)
    .then(successFn)
    .fail(failFn)

生成的网址为:/odata/passos/Passos?$filter=Id eq 1
正确的应该是:/odata/passos(2)

问题

如何在使用fetchEntityByKey检索实体使用odata/entity(id)时修改Breeze?

0 个答案:

没有答案