在oData WebAPI中更新导航属性

时间:2013-06-29 07:47:31

标签: odata asp.net-web-api-routing

我正在使用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)/ answers ----成功运作。 在控制器中,我添加了一个处理此请求的操作:

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

发布 - / odata / questions(1)/回复---- 这不起作用;错误 消息是:此服务不支持形式为&#39;〜/ entityset / key / navigation&#39;

的OData请求

我在控制器中添加的方法是:

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

如何支持在oData WebAPI中添加/更新导航属性

1 个答案:

答案 0 :(得分: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);

完整的样本为here