3

我的项目是基于 ASP.Net MVC Web API 4 应用程序创建的。如果它的模型具有以下实现:

public class BaseEntity
{
    public  object Id {get; set;}
}

public class Entity1 : BaseEntity
{
    public  string Name {get; set;}
}

Wep API 控制器是:

public class Entity1Controller : ApiController
{
    ...

    [Queryable]
    public IQueryable<T> Get()
    {
        return repository.Table.AsQueryable();
    }
}

并且 Web API 配置有这个设置:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ...

        ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
        modelBuilder.EntitySet<BaseEntity>("BaseEntity");
        modelBuilder.EntitySet<Entity1>("Entity1");
        IEdmModel model = modelBuilder.GetEdmModel();

        GlobalConfiguration.Configuration.SetEdmModel(model);
    }
}

因此,当在客户端应用程序中生成一个请求时:

$.getJSON("api/Entity1?$filter=Id eq '" + id + "'",
function (data) {
        ...
    });

我的应用程序遇到以下错误:

{"Message":"The query specified in the URI is not valid.","ExceptionMessage":"Type 'Entity 1' does not have a property 'Id'."}

为什么 URI 中指定的查询使用 Web API OData 无效?

4

1 回答 1

2

向 OdataModelBuilder 添加继承支持

用户现在可以定义抽象实体类型和派生自另一个实体类型的实体类型。OData 不支持复杂类型继承。

此提交仅在模型构建器中添加支持。对 ODataConventionModelBuilder、ODataMediaTypeFormatter 和查询支持的继承支持仍待定。

参考:http ://aspnetwebstack.codeplex.com/SourceControl/changeset/f4c252a30e68

要解决上述问题,请使用以下步骤:

  1. 从http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData安装 nuget 包 
  2. 将 Id 属性的类型更改为字符串(这是因为 OData 中不支持对象类型。您应该将 Id 设置为字符串等 odata 原始类型)。
  3. 从 Application_Start 中删除任何配置。
  4. 将 config.EnableQuerySupport() 添加到 WebApi.config。
于 2012-11-04T15:15:20.167 回答