Как изменить состояние рабочего процесса вновь созданного рабочего элемента TFS через API?

Я создаю приложение миграции рабочих элементов из "чего-то" в TFS 2013 и хочу, чтобы рабочие элементы TFS находились в соответствующих состояниях рабочего процесса, как в исходной системе. Например, если исходный рабочий элемент находится в состоянии "Закрыто", я хочу, чтобы он был в состоянии "Готово" в TFS.

Я следовал советам в этой статье, которая предлагает установить BypassRules собственность WorkItemStore Возражать true для того, чтобы иметь возможность установить CreatedDate поле. Полагаю, то же самое относится и к изменению состояния рабочего процесса, поскольку оно также требует обхода правил.

Итак, я попробовал следующее:

// obtain collection and authenticate towards it
var collection = new TfsTeamProjectCollection(new Uri(_tfsUrl), cred);
collection.Authenticate();

// get the work item store object
var store = new WorkItemStore(collection, WorkItemStoreFlags.BypassRules);

// creating the work item
var workItem = new WorkItem(store.Projects[_tfsProjectName].WorkItemTypes["Product Backlog Item"]);

// setting some standard fields
workItem.Title = "some name";
workItem.Description = "some description";

// validating the work item
if (workItem.Validate().Count > 0)
{
   // throw validation rules violated
}

// saving the work item
workItem.Save();    

Как видите, этот образец не нарушает никаких правил проверки, и workItem.Validate().Count возвращается 0, Но призыв к workItem.Save() выдает следующее исключение:

Дополнительная информация: TF26212: Team Foundation Server не удалось сохранить ваши изменения. Могут быть проблемы с определением типа рабочего элемента. Попробуйте еще раз или обратитесь к администратору Team Foundation Server.

Я дважды проверил это BypassRules установлен в true прямо перед звонком Save() метод. Кроме workItem.IsValid это также true,

Интересным фактом является то, что если я изменю способ получения WorkItemStore объект, от

var store = new WorkItemStore(collection, WorkItemStoreFlags.BypassRules);

в

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

это может спасти без каких-либо проблем! Но в этом случае я не знаю, как установить BypassRules в true, Это свойство доступно только для чтения, когда WorkItemStore объект создан, и я получаю ошибки проверки, если я пытаюсь установить шаг рабочего процесса в нечто иное, чем "Новый".

Итак, мой основной вопрос: как создавать рабочие элементы в TFS через API и иметь возможность изменять State поле в этом новом элементе?

1 ответ

Решение

Хорошо, ребята, как это часто бывает, ответ в руководстве. Позволь мне объяснить.

В статье, на которую я ссылаюсь в своем вопросе, четко говорится:

Вы должны быть членом учетной записи службы сбора проектов

Но это не значит, что вы не можете легко добавить пользователя или группу в Project Collection Service Accounts, Если вы попытаетесь сделать это через веб-доступ, у вас ничего не получится - кнопка "Добавить" просто отключена. Кроме того, снимок экрана вводит в заблуждение, показывая учетную запись в качестве члена Project Collection Administrators group,

По умолчанию Project Collection Service Accounts group содержит одну группу под названием Team Foundation Service Accounts, И это группа, в которую вы должны добавить учетную запись. Это можно сделать с помощью консольного приложения TFSSecurity.exe:

TFSSecurity.exe /g+ "Team Foundation Service Accounts" "Domain\my-service-account" /server:http://mytfsserver:8080/tfs

Это подробно объясняется в этой статье, которая описывает мой случай с правильным разрешением. Файл TFSSecurity.exe находится по следующему адресу: %ProgramFiles(x86)%\Microsoft Visual Studio \Common7\IDE (например, C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE)

Другие вопросы по тегам