我正在尝试Odata增量补丁,但是遇到了与the documentation here about complex entities相适应的问题。总而言之,Patch的增量无法处理复杂的实体而不将模型状态设置为无效。
这是我的打字稿服务电话
editComment(comment: Update<DisciplineComment>): Observable<DisciplineComment> {
this.log("Editing a Comment");
return this.http.patch<DisciplineComment>(this.odataUrl + "Comments(" + comment.id + ")", comment.changes, this.httpPatchOptions);
}
这是对应的服务
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Comment> comment)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
using (CreateTimedTelemetryTrace())
{
var entity = await DataContext.Comments.FindAsync(key);
if (entity == null)
{
return NotFound();
}
comment.Patch(entity);
var now = DateTime.UtcNow;
entity.UpdatedBy = RequestContext.Principal.Identity.Name;
entity.UpdatedAt = now;
try
{
await DataContext.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CommentExists(key))
{
return NotFound();
}
throw;
}
return Updated(entity);
}
}
执行此操作时,我可以通过断点看到ModelState.IsValid,由于以下错误,它显示为无效:
无法将PATCH应用于实体类型“ APP.Models.Comment”上的导航属性“ resolution”。
我发现有一个绕过部分问题的黑客-如果我在请求之前添加以下行:
comment.changes.resolution = null;
然后我的代码仅在服务器端执行,并且进行了更新。不幸的是,鉴于这是可以观察的,我似乎无法在执行后再增加分辨率。
对于补丁问题,是否有更好的解决方法,或者将解决方案重新应用于可观察对象?