2017-02-14 38 views
1

У меня есть контроллер WebApi 2. Я хочу использовать патч OData на одном из контроллеров. Вот что я сделал до сих пор.OData Patch не обновляет базу данных

я добавил следующую строку в WebApiConfig

config.MapODataServiceRoute("odata", "odata", GenerateEdmModle()); 
private static Microsoft.OData.Edm.IEdmModel GenerateEdmModle() 
{ 
    var builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<Auth>("Auths"); 

    return builder.GetEdmModel(); 
} 

Тогда в контроллере, Это, как я пытаюсь использовать метод патч

[HttpPatch] 
public async Task<IHttpActionResult> PatchAuth(int id, Delta<Auth> value) 
{ 
    var auth = await db.Auth.FindAsync(id); 
    if (auth == null) return NotFound(); 

    System.Diagnostics.Debug.WriteLine(auth.direction, auth.id); 
    System.Diagnostics.Debug.WriteLine("Patching"); 

    try 
    { 
     value.Patch(auth); 
     await db.SaveChangesAsync(); 
    } 
    catch (Exception e) 
    { 
     System.Diagnostics.Debug.WriteLine(e.Message); 
     return InternalServerError(e); 
    } 
    return Ok(value); 
} 

А вот как я посылаю его от угловая служба

// patch auth 
service.patchAuth = function (authId, auth) { 

    var request = $http({ 
     method: 'PATCH', 
     url: baseUrl + 'api/Auths', 
     data: JSON.stringify(auth), 
     params: { id: authId }, 
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
    }); 

    return (request.then(handleSuccess, handleError)); 
} 

Вот что я вижу в Скрипач enter image description here

Я вижу, что контроллер обнаруживает метод исправления и кажется, что он пытается обновить, но значение никогда не обновляется.

Я также добавляю точку останова в value.Patch(auth) и проверял changedProperties, но ничего не существует. Я пытался выяснить, что вызывает это, но у вас нет подсказки.

+0

я столкнулся же проблема, но только со значениями целочисленных типов. значения string и bool обновляются, но не целые. любая идея почему? Я пробовал все в почтальоне. Он потратил впустую мои 3 дня –

ответ

1

В качестве вашего контента вы указали application/x-www-form-urlencoded. Вместо этого вы должны использовать application/json.

Когда вы укажете application/x-www-form-urlencoded, вызов по-прежнему маршрутизируется на правильный обработчик исправлений (как в вашем случае), однако никакие измененные свойства не передаются в Delta<T> по Web.Api.

При проверке сырым HTTP Request в Скрипач ваш вызов должен более выглядеть следующим образом:

PATCH http://www.example.com/api/Auths(5) HTTP/1.1 
Content-Type: application/json 
Host: www.example.com 
Content-Length: 20 

{ "id" : 123456789 } 
+0

Я пробовал в обоих направлениях, и, возможно, больше. Он нашел функцию, но только не обновлял свойство. Я нашел JsonPatch, поскольку пытался найти решение для этого. Он был очень прост в использовании и работал точно так, как я хотел. Более подробную информацию о JsonPatch можно найти по адресу http://jsonpatch.com/ – Kuni

+0

. Я посмотрел на jsonpatch, и это выглядит интересно. Возможно, я смогу использовать это в некоторых своих проектах. Однако в вашей предыдущей реализации, должно быть, было что-то не так, поскольку 'PATCH' работает правильно, как описано в нескольких наших проектах. Еще спасибо за ссылку! –

+0

Добро пожаловать. Я уверен, что у меня что-то не хватает с моей предыдущей реализацией, как вы сказали. – Kuni