2015-07-03 6 views
1

Сценарий - это приложение, которое использует OData v4, серверный API на основе модели Entity Framework с использованием ODataLib, на стороне клиента, используя расширение генератора кода клиента OData для Visual StudioМаршрутизация атрибута OData для удаления отношения между m: m объектами

Я не в состоянии получить атрибут OData маршрутизации работает для удаления отношений сущностей в м: м отношений, для которых клиент генерирует DELETE запросов в виде:

http://developer4:8080/odata/tblTestRestaurant(241)/tblTestDishes/$ref?$id=http://developer4:8080/odata/tblTestDish(1) 

атрибута маршрутизации для POST для создания ссылка работает очень хорошо - связанный идентификатор объекта закодирован в теле, а следующий c ontroller декларация метода действия работает (сам контроллер имеет [ODataRoutePrefix("tblTestRestaurant")]):

[ODataRoute("({pRestaurantID})/tblTestDishes/$ref")] 
    [HttpPost] 
    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)] 
    public async Task<IHttpActionResult> PostAttachtblTestDishes([FromODataUri] int pRestaurantID, 
     [FromBody] Uri uri) { ... } 

Но я не могу получить что-то подобную работу для УДАЛИТЬ, где идентификатор соответствующего объекта задается с помощью $ref?id=... синтаксиса в URL.

Я попытался следующие с помощью атрибута ODataRoute:

[ODataRoute("({pRestaurantID})/tblTestDishes/$ref")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef1([FromODataUri] int pRestaurantID, 
     [FromODataUri] Uri relatedUri) 
    { 
     throw new NotImplementedException(); 
    } 
    [ODataRoute("({pRestaurantID})/tblTestDishes/$ref")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef2([FromODataUri] int pRestaurantID, 
     [FromODataUri] string relatedUri) 
    { 
     throw new NotImplementedException(); 
    } 
    [ODataRoute("({pRestaurantID})/tblTestDishes/$ref?$id={pRelated}")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef3([FromODataUri] int pRestaurantID, 
     [FromODataUri] string pRelated) 
    { 
     throw new NotImplementedException(); 
    } 
    [ODataRoute("({pRestaurantID})/tblTestDishes/$ref?$id={pRelated}")] 
    [HttpDelete] 
    public async Task<IHttpActionResult> TestRemoveRef4([FromODataUri] int pRestaurantID, 
     [FromODataUri] Uri pRelated) 
    { 
     throw new NotImplementedException(); 
    } 

Но ни один из указанных выше действий контроллера получить удар в ответ на запрос удаления к http://developer4:8080/odata/tblTestRestaurant(241)/tblTestDishes/$ref?$id=http://developer4:8080/odata/tblTestDish(1).

Единственный способ, которым я могу заставить его работать, чтобы не использовать атрибут маршрутизации, но вместо того, чтобы полагаться на конвенции маршрутизации OData, т.е.

[HttpDelete] 
    public async Task<IHttpActionResult> DeleteRef([FromODataUri] int key, 
     [FromODataUri] string relatedKey, string navigationProperty) 
    { 
     throw new NotImplementedException(); 
    } 

Этот метод основан на проверку строки navigationProperty отработать какую коллекцию навигацию свойство для объекта для изменения - вместо этого я предпочел бы использовать маршрутизацию атрибутов и иметь отдельный метод действия в моем контроллере для каждого свойства навигации для коллекции.

Я использовал ряд руководств и документации в частности https://damienbod.wordpress.com/2014/06/10/getting-started-with-web-api-and-odata-v4/

Я также через некоторые из тестовых случаев OData WebAPI, особенно this one, который использует смесь маршрутизации атрибутов и конвенций маршрутизации OData - но Безразлично 't содержать пример для маршрутизации атрибутов для удаления ссылок.

Так что мой вопрос: какой синтаксис и параметры атрибута ODataRoute следует использовать, если предположить, что атрибут ODataRoute поддерживает этот ... $ ref? Id = ... синтаксис в URL-адресе для удаления; а если нет, то какие альтернативы есть?

ответ

1

Web API OData проанализирует Uri в $Id, чтобы создать сегмент ключей, присоединенный к сегментам пути происхождения. Итак, если вы изменить шаблон, как показано ниже, он должен работать:

[ODataRoute("({pRestaurantID})/tblTestDishes({pRelated})/$ref")] 
[HttpDelete] 
public async Task<IHttpActionResult> TestRemoveRef([FromODataUri] int pRestaurantID, [FromODataUri] int pRelated) 
{ 
     ... 
} 

Вы можете сослаться на мой образец проекта here. Надеюсь, это может вам помочь. Благодарю.

+0

Ваш шаблон работает, спасибо. Но работает ли $ id при добавлении ссылочной сцены? – user1729842

+0

Что добавляет эталонная сцена? вы имеете в виду «Post»? –

+0

Это отлично работает, большое спасибо. В стороне, есть ли какой-нибудь инструмент отладки, который я мог бы использовать, чтобы определить, как OData перевел входящий запрос, т.е. чтобы я мог разработать для других сценариев атрибут маршрута? – stebay

Смежные вопросы