DTOで作業するときのパッチ

asp.net-core c# entity-framework-core json-patch rest

質問

私はasp.net core webAPiとEF coreで作業しており、 "更新"操作(部分的にエンティティを編集)を実装したいと考えています。私はそれに対処する正しい方法を探し、jsonPatchを使うべきであることを見た。問題は私がAPIを使ってDTOを公開していること、jsonPatchを次のように使用している場合です。

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

DTOにパッチを適用する必要があります。新しいエンティティを作成せずに、モデルエンティティに適用することはできません。

私はまた、Odata.Deltaについて読ん、それはまだasp.netコア上で動作し、さらにはない-私はそれがDTOを操作するためのソリューションが組み込まれていないと思います(私が見つかりました。 この例のコアのODATAがすることができます利用可能になる)

だから、私は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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ