Сценарий - это приложение, которое использует 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-адресе для удаления; а если нет, то какие альтернативы есть?
Ваш шаблон работает, спасибо. Но работает ли $ id при добавлении ссылочной сцены? – user1729842
Что добавляет эталонная сцена? вы имеете в виду «Post»? –
Это отлично работает, большое спасибо. В стороне, есть ли какой-нибудь инструмент отладки, который я мог бы использовать, чтобы определить, как OData перевел входящий запрос, т.е. чтобы я мог разработать для других сценариев атрибут маршрута? – stebay