2016-07-19 2 views
5

Я работаю над основным ядром ASPP и базовым ядром EF и хочу реализовать операцию «обновления» (частично редактировать объект). Я искал правильный способ справиться с этим и увидел, что я должен использовать jsonPatch. Проблема в том, что я разоблачить только DTOs через мой API, и если я использую jsonPatch как:PATCH при работе с DTO

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

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

Я также читал об Odata.Delta, но он все еще не работает на ядре asp.net, и более того - я не думаю, что у него есть встроенное решение для работы с dto (я нашел this example, что может помочь, когда Odata для ядра будет доступно)

Итак, на данный момент - следует использовать POST и отправлять DTO со списком измененных свойств в запросе (как я видел here), Или - есть более элегантное решение?

Спасибо!

ответ

1

Теперь я увидел, что с помощью autoMapper я могу сделать только

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

и он работает как шарм :)

0

В конце концов,

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

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

И затем, в слое BL,

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

Обратите внимание, что если вы используете его так, вы не можете использовать ModelState как «patch.ApplyTo (accountToTestValidation, ModelState); – arielorvits

+0

, но я все еще могу вручную проверить исправленную проверку объекта на 'patch.ApplyTo (исправлено); TryValidateModel (исправлено); ' – arielorvits

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