2013-11-14 5 views
1

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

Я следовал советует в this article, что предполагает установить 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 в этом новом созданном элементе?

ответ

4

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

article I referenced в моем вопросе четко сказано:

Вы должны быть членом Службы Collection Project Счета

Но это не говоря уже о том, что вы не можете легко добавить пользователя или группы до 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 

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

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