Come utilizzare Delta da OData Web API Microsoft ASP.NET con Code First \ JsonMediaTypeFormatter

Qual’è il problema?

Sto cercando di abilitare le patch nella mia app API web ASP.net. Sto usando il primo framework di entity framework del codice.

Ho la seguente intestazione del metodo che posso impostare un breakpoint e colpirà:

[AcceptVerbs("PATCH")] public async Task Patch(long appId, long id, Delta formGroup) 

Tuttavia quando chiamo formGroup.Patch (entity framework), non vengono apportate modifiche alla mia entity framework. Se metto il seguente nella finestra immediata:

 formGroup.GetChangedPropertyNames() 

Quindi questa raccolta è vuota, il che sembra sbagliato.

Cosa ho provato?

Mi riferisco ai seguenti esempi

http://techbrij.com/http-patch-request-asp-net-webapi http://www.strathweb.com/2013/01/easy-asp-net-web-ap-resource-updates-with-delta /

Sembra essere un problema con il formattatore JSON MediaType che non sa come build correttamente l’object Delta, tuttavia nel 2 ° link filip sembra suggerire che dovrebbe funzionare senza oDataMediaTypeFormatter.

Ho iniziato la linea di provare a serializzare il mio modello alla rappresentazione EDMX, quindi da lì estrarre il CSDL in modo da poter creare un oDataMediaTypeFormatter, ma ho anche riscontrato un intoppo, inoltre sembra un po ‘eccessivo.

Se qualcuno potesse far luce su questo sarebbe molto apprezzato. Fammi sapere se sono necessarie ulteriori informazioni.

MODIFICARE:

Ecco la definizione di class per SimpleFormGroup:

 public class SimpleFormGroup { public int LastUpdate; public string Identifier; public string Title; public int DisplayOrder; } 

Ed ecco i dati che sto inviando:

 Content-Type: 'application/json' { "DisplayOrder" : "20 } 

Grazie, Pete

Interessante, sembra che Delta con membri int non funzioni in JSON.

Sfortunatamente, Delta stato creato appositamente per OData. Se Delta sembra funzionare con qualsiasi formattatore diverso da OData, è una coincidenza piuttosto che essere intenzionale.

Tuttavia, la buona notizia è che non c’è nulla che ti impedisca di definire il tuo formato PATCH per JSON, e sarei sorpreso se nessuno ne avesse già scritto uno che funzioni meglio con Json.NET. È ansible che rivedremo le patch in una versione futura dell’API Web e proveremo a creare una storia coerente che funzioni su tutti i programmi di formattazione.

Grazie a Youssef per indagare e scoprire perché le cose non funzionavano. Spero che questo possa essere risolto lungo la linea.

Sono riuscito a crackare me stesso alla fine, dopo aver esaminato la fonte del pacchetto oData. Ho scelto di implementare un altro MediaTypeFormatter che avvolge la logica in quanto fornisce un facile accesso a HttpContent, ma ci sono altri modi per raggiungere questo objective.

La parte fondamentale era capire come interpretare il codice del primo modello, vedere la riga commentata di seguito:

 public override Task ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) { var builder = new ODataConventionModelBuilder(); // This line will allow you to interpret all the metadata from your code first model builder.EntitySet("EfContext"); var model = builder.GetEdmModel(); var odataFormatters = ODataMediaTypeFormatters.Create(model); var delta = content.ReadAsAsync(type, odataFormatters).Result; var tcs = new TaskCompletionSource(); tcs.SetResult(delta); return tcs.Task; } 

Spero che questo salvi qualcuno qualche problema!