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);
    }
}

そのため、クライアント側アプリケーションで 1 つのリクエストが生成されると、次のようになります。

$.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 は複合型の継承をサポートしていません。

このコミットは、ModelBuilder でのサポートのみを追加します。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 に答える