2010-05-20 3 views
4

я могу успешно создать путь итерации через:Сохранение WorkItem # IterationPath на вновь созданную Итерация

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); 

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

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

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

ответ

0

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

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

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

3

Это фиксированное для меня:

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

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

2

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

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

Ключевым моментом является использование класса 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

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

Смежные вопросы