复杂实体导致模型状态无效的Odata Delta补丁

时间:2019-02-06 14:44:01

标签: angular odata observable

我正在尝试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;

然后我的代码仅在服务器端执行,并且进行了更新。不幸的是,鉴于这是可以观察的,我似乎无法在执行后再增加分辨率。

对于补丁问题,是否有更好的解决方法,或者将解决方案重新应用于可观察对象?

0 个答案:

没有答案