6

2 つの作業項目間に親子関係をプログラムで追加しようとしています。Microsoft Team Foundation および Visual Studio Services ライブラリを使用して、TFS 2015 および VSTS バックログ オブジェクトをエクスポートおよびインポートしています。

https://docs.microsoft.com/en-us/vsts/integrate/concepts/dotnet-client-libraries

https://www.visualstudio.com/en-us/docs/integrate/api/wit/samples#migrating-work-items

サーバーへの VssConnection を取得し、WorkItemTrackingHttpClient を取得して Wiql クエリを実行し、作業項目を作成しました。また、対象の作業項目の親を識別するためのクエリもあります。

私が理解できないのは、子作業項目とその親の間のリンクを追加する方法です。親を追加するための正しい JsonPatchDocument アイテム パス、または親リンクで更新するための既存の WorkItem の正しいプロパティまたはメソッドがわかりません。これらのライブラリを使用して作業項目に親関係を追加するためのドキュメント リンクまたは特定の情報を持っている人はいますか?

コンテキストのコードの抜粋を次に示します。

using Microsoft.TeamFoundation.Core.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using Microsoft.VisualStudio.Services.Client;
using Microsoft.VisualStudio.Services.WebApi;
using Microsoft.VisualStudio.Services.WebApi.Patch;
using Microsoft.VisualStudio.Services.WebApi.Patch.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
// ...
var sourceConnection = new VssConnection(new Uri(_sourceTsUrl), new VssClientCredentials());
var targetConnection = new VssConnection(new Uri(_targetTsUrl), new VssClientCredentials());
var sourceClient = sourceConnection.GetClient<WorkItemTrackingHttpClient>();
var targetClient = targetConnection.GetClient<WorkItemTrackingHttpClient>();
// ...
var queryResults = sourceClient.QueryByWiqlAsync(query).Result;
var ids = queryResults.WorkItems.Select(x => x.Id).ToList();
var items = sourceClient.GetWorkItemsAsync(ids);
foreach (var item in items.Result)
{
    // ...
    var patchItem = new JsonPatchDocument();
    foreach (var fieldName in item.Fields.Keys)
    { patchItem.Add(new JsonPatchOperation() { Path = $"/fields/{fieldName}", Value = item.Fields[fieldName], Operation = Operation.Add }); }
    // TODO - add patch field(?) for parent relationship
    var parentResults = sourceClient.QueryByWiqlAsync(parentQuery).Result;
    // ...
    var task = targetClient.CreateWorkItemAsync(patchItem, targetProject, itemType, validateOnly, bypassRules, suppressNotifications);
    var newItem = task.Result;
    // TODO - alternatively, add parent via the returned newly generated WorkItem
}

補遺: 次のコードを追加しようとしましたが、変更がリモート オブジェクトにコミットされず、ローカル メモリにのみ存在し、変更/更新をプッシュする方法が見つかりません。

if (!string.IsNullOrWhiteSpace(mappedParentUrl))
{
    if (newItem.Relations == null)
    { newItem.Relations = new List<WorkItemRelation>(); }
    newItem.Relations.Add(new WorkItemRelation() { Rel = "Parent", Title = mappedParentTitle, Url = mappedParentUrl });
}
4

1 に答える 1