Сохранение WorkItem # IterationPath на вновь созданной итерации - PullRequest
5 голосов
/ 21 мая 2010

Я могу успешно создать путь итерации через:

var commonservice = collection.GetService<ICommonStructureService>();

// create new area path and iteration path
var iterationRoot = commonservice.GetNodeFromPath("\\MyTeamProject\\Iteration");
var newIterationPath = commonservice.CreateNode("my new sprint", iterationRoot.Uri);

Однако, когда я пытаюсь назначить этот путь к рабочему элементу и сохранить его, поле не проверяется.

Если я снова запускаю тесты (с уже созданной итерацией), тот же код завершается успешно.

Кто-нибудь знает, как заставить это работать?

Ответы [ 4 ]

3 голосов
/ 16 февраля 2011

Это исправило это для меня:

WorkItemStore wis = (WorkItemStore)tfsTeamProjColl.GetService(typeof(WorkItemStore));
wis.RefreshCache();
wis.SyncToCache();

Может быть, это кому-нибудь поможет.

2 голосов
/ 18 апреля 2014

Я испытал точно такое же поведение, и, к сожалению, ответ @JWC не помог. Решение, которое работает для меня, можно найти по этой ссылке .

Итак, это краткое изложение на тот случай, если первоначальный ответ будет утерян.

Ключевым моментом является использование WorkItemServer класса. Он живет в Microsoft.TeamFoundation.WorkItemTracking.Proxy.dll сборке.

Прежде всего, вы создаете экземпляр WorkItemStore:

var store = collection.GetService<WorkItemStore>();

Затем создайте необходимые пути итерации:

var commonservice = collection.GetService<ICommonStructureService>();

var iterationRoot = commonservice.GetNodeFromPath("\\MyTeamProject\\Iteration");
var newIterationPath = commonservice.CreateNode("my sprint", iterationRoot.Uri);

Затем обновите кэш в TFS (я подозреваю, что это похоже на нажатие F5 в веб-интерфейсе):

var wiServer = collection.GetService<WorkItemServer>();
wiServer.SyncExternalStructures(WorkItemServer.NewRequestId(), commonservice.GetProjectFromName("MyTeamProject").Uri);
store.RefreshCache();

И, наконец, назначьте вновь созданный рабочий элемент вновь созданной итерации:

var wi = new WorkItem(store.Projects["MyTeamProject"].WorkItemTypes["Product Backlog Item"]);

wi.Title = "Hello from API";
wi.Description = "This work item was created from API";
wi.Fields["Assigned To"].Value = "Yan Sklyarenko";

wi.IterationPath = FormatPath(commonservice.GetNode(newIterationPath).Path, "Iteration", "MyTeamProject");

wi.Save();

Вот и все! Метод FormatPath переводит путь итерации в форму, требуемую для поля рабочего элемента IterationPath, то есть от \MyTeamProject\Iteration\my sprint до MyTeamProject\my sprint.

Надеюсь, это поможет сэкономить время.

ПРИМЕЧАНИЕ: я запускаю это к TFS 2013.

0 голосов
/ 24 октября 2014

У меня была похожая проблема.Я создал Areapath, а затем создал запрос, в котором использовался AreaPath.Я позвонил store.RefreshCashe (), но это не сработало.Только в Отладчике, когда я запускаю store.RefreshCashe () два раза вручную.Спасибо "Ян Скляренко".Я попробовал ваше предложение, и оно отлично работает (TFS Server 2012).

0 голосов
/ 22 мая 2010

Вероятно, вы столкнулись с проблемой кеширования.Попробуйте очистить кеш после создания итерации.Несколько вещей, которые вы можете попробовать:

  1. Получить новую копию WorkItemStore.
  2. Отключить и повторно подключиться к TFS
  3. Проверьте, есть ли «обновление»метод на объектах WIS или на сервере TFS.Я закрыл свой экземпляр dev TFS на ночь, и я не помню, есть ли что-нибудь подобное.

Если это не совсем так, опубликуйте свой код, и я посмотрю, еслиЯ могу воспроизвести это.

...