我正在使用GET
创建Web API 2,为我的模型提供以下HTTP谓词:POST
,PUT
和IEnumerable<MySubresourceModel>
,这意味着对于每个资源(模型类),我可以从以下URL 插入/更新/检索数据:
对于我的子资源(子模型),我可以通过以下网址执行相同操作:
但是,为了拥有子资源,我必须在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 Functions
和django-registration-redux
,但这对我没用。