首页 > 解决方案 > 使用 .NET API 在 Azure DevOps 中批量创建许多工作项时出现错误 VS403357

问题描述

我正在尝试使用 Azure DevOps .NET API 在 AzureDevOps 存储库中批量创建 WorkItem,但是当我提交批处理请求时,我收到一条错误消息:“VS403357:批处理中的工作项预计为唯一,但在多个请求中找到 ID 为 -1 的工作项。”

这是我的代码:

  public void ExecuteWorkItemMigration(int[] workItemIds, IProgress<ProgressResult> progress = null)
  {
      var wiql = "SELECT * FROM WorkItems";
      var query = new Query(_workItemStore, wiql, workItemIds);
      var workItemCollection = query.RunQuery();
      string projectName = MainSettings.AzureDevOpsSettings.ProjectName;

      List<WitBatchRequest> batchRequests = new List<WitBatchRequest>();
      foreach (WorkItemTfs tfsWorkItem in workItemCollection)
      {
          JsonPatchDocument document = CreateJsonPatchDocument(tfsWorkItem);
          string workItemType = GetWorkItemType(tfsWorkItem);
          WitBatchRequest wibr = _azureDevopsWorkItemTrackingClient.CreateWorkItemBatchRequest(projectName, workItemType,
              document, true, true);

          batchRequests.Add(wibr);
      }

      List<WitBatchResponse> results = _azureDevopsWorkItemTrackingClient.ExecuteBatchRequest(batchRequests).Result;
  }


private static JsonPatchDocument CreateJsonPatchDocument(WorkItemTfs tfsWorkItem, int id = -1)
    {
        var document = new JsonPatchDocument();
        document.Add(
            new JsonPatchOperation
            {
                Path = "/id",
                Operation = Operation.Add,
                Value = id
            });

        document.Add(
            new JsonPatchOperation
            {
                Path = "/fields/System.Title",
                Operation = Operation.Add,
                Value = tfsWorkItem.Title
            });

        if (tfsWorkItem.Fields.Contains("ReproSteps"))
            document.Add(
                new JsonPatchOperation
                {
                    Path = "/fields/Microsoft.VSTS.TCM.ReproSteps",
                    Operation = Operation.Add,
                    Value = tfsWorkItem.Fields["ReproSteps"].Value
                });

    }

关于我需要做什么才能使其正常工作的任何建议?我曾尝试提交不同的唯一 ID,但似乎并不能阻止错误的发生。

标签: azure-devopsmigration

解决方案


您需要使用唯一的否定ID 来创建 WorkItem ID。

像这样的东西:

public void ExecuteWorkItemMigration(int[] workItemIds, IProgress<ProgressResult> progress = null)
    {
        var wiql = "SELECT * FROM WorkItems";
        var query = new Query(_workItemStore, wiql, workItemIds);
        var workItemCollection = query.RunQuery();
        string projectName = MainSettings.AzureDevOpsSettings.ProjectName;

        List<WitBatchRequest> batchRequests = new List<WitBatchRequest>();

        int id = -1;
        foreach (WorkItemTfs tfsWorkItem in workItemCollection)
        {
            JsonPatchDocument document = CreateJsonPatchDocument(tfsWorkItem, id--);
            string workItemType = GetWorkItemType(tfsWorkItem);
            WitBatchRequest wibr = _azureDevopsWorkItemTrackingClient.CreateWorkItemBatchRequest(projectName, workItemType,
                document, true, true);

            batchRequests.Add(wibr);
        }

        List<WitBatchResponse> results = _azureDevopsWorkItemTrackingClient.ExecuteBatchRequest(batchRequests).Result;
    }

推荐阅读