使用JsonPatchDocument在C#中更新Azure DevOps工作项父项
解决Azure DevOps工作项父项无法更新的问题
我之前也踩过这个一模一样的坑!能正常创建工作项并设置父项,但更新已存在工作项的父项时怎么都不成功,甚至还收到「无法更改关系类型」的错误提示——哪怕精准定位到关系的具体索引,结果还是一样。
我最初的错误尝试
一开始我以为直接用Replace操作修改关系就能搞定,写了这样的代码:
private JsonPatchOperation GetParentPatchOperation(WorkItem item, Operation operation) { var patch = new JsonPatchOperation() { Operation = operation, Path = "/relations/-", Value = new { rel = "System.LinkTypes.Hierarchy-Reverse", url = item.Url, attributes = new { comment = "" } } }; return patch; }
不管是用/relations/-还是指定具体索引(比如/relations/0),Azure DevOps都会返回「无法更改关系类型」的错误——这是因为它根本不允许直接修改已存在的关系条目,哪怕是同类型的父项变更也不行。
正确的解决方案
更新工作项父项的正确姿势是两步走:先删除原有的父项关系,再添加新的父项关系。
示例代码如下:
// 第一步:删除原有的父项关系 // 注意:{index}要替换成实际的父项关系索引,可先通过Get接口获取工作项关系列表,找到类型为System.LinkTypes.Hierarchy-Reverse的条目索引 var deleteParentPatch = new JsonPatchOperation() { Operation = Operation.Remove, Path = "/relations/{index}" }; // 第二步:添加新的父项关系 var addParentPatch = new JsonPatchOperation() { Operation = Operation.Add, Path = "/relations/-", Value = new { rel = "System.LinkTypes.Hierarchy-Reverse", url = newParentWorkItem.Url, attributes = new { comment = "更新工作项父项" } } }; // 将两个操作加入补丁列表,一起提交到Azure DevOps接口 var patchDocument = new List<JsonPatchOperation> { deleteParentPatch, addParentPatch };
关键说明
- Azure DevOps的工作项关系不支持直接修改,必须通过「删除旧关系+添加新关系」的方式来更新父项
- 执行删除操作前,一定要确认目标索引对应的是
System.LinkTypes.Hierarchy-Reverse类型的关系(也就是父项关系),避免误删其他类型的链接
内容的提问来源于stack exchange,提问作者SteveB
相关产品推荐
相关产品推荐

