如何创建一个"子资源"使用OData而不为它创建集合属性?

时间:2016-10-31 13:51:07

标签: c# .net asp.net-web-api asp.net-web-api2 odata

我正在使用GET创建Web API 2,为我的模型提供以下HTTP谓词:POSTPUTIEnumerable<MySubresourceModel>,这意味着对于每个资源(模型类),我可以从以下URL 插入/更新/检索数据:

  • / API / myResourceName
  • / API / myResourceName / {ID}

对于我的子资源(子模型),我可以通过以下网址执行相同操作:

  • / API / myResourceName / {ID} /子资源
  • / API / myResourceName / {ID} /子资源/ {subresourceId}

但是,为了拥有子资源,我必须在ResourceModel中使用/api/$metadata,但在很多情况下我不想要它,因为它& #39;将通过&#34; medatata网址(GET /api/people/10/addresses/5)作为集合显示,但我不允许在中创建/更新/检索这些项目 &#34;资源模型的行动&#34;本身。

示例:

为了让public class PersonModel { // Without this property the API even doesn't run public IEnumerable<AddressModel> Addresses { get; set; } } 行动有效,我必须:

模特:

modelConfiguration.AddEntity<PersonModel>("people");
modelConfiguration.AddEntity<AddressModel>("addresses");

OData配置:

[ODataRoutePrefix("people/{personId}/addresses")]
public class PeopleAddressesController : ODataController
{
    [EnableQueryDefault]
    [ODataRoute("{id}")]
    public IHttpActionResult Get(int personId, int id)
    {
        // [...]
    }

    // [...]
}

控制器:

Addresses

但是当我在PersonModel中没有属性Actions时,应用程序启动时会抛出异常:

  

System.InvalidOperationException:路径模板&#39; people / {personId} /地址&#39;关于行动&#39; Ge *&#39;在   控制器&#39; PeopleAddresses&#39;不是有效的OData路径模板。发现   一个未解决的路径段&#39;地址&#39;在OData路径模板中   &#39;人/ {PERSONID} /地址&#39;

问题是:如何在没有集合属性的情况下拥有子资源?

PS:我已经尝试过使用OData Functionsdjango-registration-redux,但这对我没用。

0 个答案:

没有答案