私は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;
}