2016-07-19 9 views
5

Ich arbeite auf asp.net Core WebAPi und EF Core, und möchte "Update" Operation (teilweise bearbeiten Einheit) implementieren. Ich suchte den richtigen Weg, um damit umzugehen, und sah, dass ich JsonPatch verwenden sollte. das Problem ist, dass ich nur durch meine DTOs API aussetzen bin, und wenn ich jsonPatch wie:PATCH bei der Arbeit mit DTO

public AccountDto Patch(int id, [FromBody]JsonPatchDocument<AccountDto> patch) 

dann brauche ich den Patch auf DTO anzuwenden, und ich kann es auf dem Modell Einheit nicht gelten, ohne eine neue Entität zu erstellen.

Ich lese auch über Odata.Delta, aber es funktioniert immer noch nicht auf asp.net Kern, und außerdem - ich glaube nicht, dass es eine eingebaute Lösung für die Arbeit mit dto (Ich fand this example, die helfen kann, wenn Odata für Core wird verfügbar sein)

Also, für jetzt - sollte ich POST und senden DTO mit einer Liste von geänderten Eigenschaften in der Abfrage (wie ich sah here), Oder - gibt es elegantere Lösung?

Danke!

Antwort

1

Jetzt habe ich gesehen, dass mit AutoMapper ich nur

CreateMap<JsonPatchDocument<AccountDTO>, JsonPatchDocument<Account>>(); 
     CreateMap<Operation<AccountDTO>, Operation<Account>>(); 
tun kann

und es funktioniert wie ein Charme :)

0

Schließlich

ich die Art von JsonPatchDocument nur entfernen, und sah, dass es ohne Art arbeiten ...

[HttpPatch("{id}")] 
    public AccountDTO Patch(int id, [FromBody]JsonPatchDocument patch) 
    { 
     return _mapper.Map<AccountDTO>(_accountBlService.EditAccount(id, patch)); 
    } 

und dann in BL-Schicht,

public Account EditAccount(int id, JsonPatchDocument patch) 
    { 
     var account = _context.Accounts.Single(a => a.AccountId == id); 
     var uneditablePaths = new List<string> { "/accountId" }; 

     if (patch.Operations.Any(operation => uneditablePaths.Contains(operation.path))) 
     { 
      throw new UnauthorizedAccessException(); 
     } 
     patch.ApplyTo(account);    
     return account; 
    } 
+0

Beachten Sie, dass wenn Sie es verwenden, Sie ModelState nicht wie 'patch.ApplyTo (accountToTestValidation, ModelState);' – arielorvits

+0

, aber ich kann immer noch manuell überprüfen die Patch-Objekt-Validierung von 'patch.ApplyTo (gepatcht); TryValidateModel (gepatcht); ' – arielorvits

Verwandte Themen