0

WebAPI oData を使用しています。要件は、エンティティの Navigation プロパティを更新することです。

public class Question
{
    public int QuestionId { get; set; }
    public string QuestionTitle { get; set; }
    public string QuestionBody { get; set; }
    public List<Response> Responses { get; set; } //navigation property
}

public class Response
{
    public string ResponseId { get; set; }
    public int QuestionId { get; set; } //fk
    public string ResponseBody { get; set; }
}

次のリンクを使用して応答を取得すると、oData Webapi で動作します

GET - /odata/questions(1)/responses ----正常に機能しました。コントローラーで、このリクエストを次のように処理するアクションを追加しました。

public IQueryable<Response> GetResponses([FromODataUri] Guid key)
{
    //
}

POST - /odata/questions(1)/responses ----これは機能していません。エラー メッセージ: このサービスは、'~/entityset/key/navigation' の形式の OData 要求をサポートしていません

コントローラーに追加したメソッドは次のとおりです。

public List<Responses> CreateResponses([FromODataUri] Guid key, List<Response> responses)
{
     //
}

oData WebAPI でナビゲーション プロパティの追加/更新をサポートするにはどうすればよいですか

4

1 に答える 1

1

ナビゲーション プロパティへの POST を処理するには、カスタム ルーティング規則が必要です。以下のコード、

// routing convention to handle POST requests to navigation properties.
public class CreateNavigationPropertyRoutingConvention : EntitySetRoutingConvention
{
    public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
    {
        if (odataPath.PathTemplate == "~/entityset/key/navigation" && controllerContext.Request.Method == HttpMethod.Post)
        {
            IEdmNavigationProperty navigationProperty = (odataPath.Segments[2] as NavigationPathSegment).NavigationProperty;
            controllerContext.RouteData.Values["key"] = (odataPath.Segments[1] as KeyValuePathSegment).Value; // set the key for model binding.
            return "PostTo" + navigationProperty.Name;
        }

        return null;
    }
}

ルーティング規約の登録、

var routingConventions = ODataRoutingConventions.CreateDefault();
routingConventions.Insert(0, new CreateNavigationPropertyRoutingConvention());
server.Configuration.Routes.MapODataRoute("odata", "", GetEdmModel(), new DefaultODataPathHandler(), routingConventions);

完全なサンプルはこちらです。

于 2013-07-01T17:52:04.333 に答える