我正在研究asp.net核心webAPi和EF核心,並希望實現“更新”操作(部分編輯實體)。我搜索了正確的方法來處理它,並看到我應該使用jsonPatch。問題是我通過我的API暴露了DTO,如果我使用jsonPatch:

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

然後我需要在DTO上應用補丁,我不能在模型實體上應用它,而不創建新的實體。

我也讀過Odata.Delta,但它仍然不適用於asp.net核心,而且 - 我不認為它有一個內置的解決方案來處理dto(我發現這個例子可以幫助當Odata for core能得到的)

所以,現在 - 我應該使用POST並在查詢中發送帶有更改屬性列表的DTO(正如我在這裡看到的那樣),或者 - 有更優雅的解決方案嗎?

謝謝!

一般承認的答案

現在我看到使用autoMapper我可以做到

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

它像魅力一樣工作:)


熱門答案

最終,

我只是從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;
    }


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow