Я создаю приложение для переноса рабочих элементов из «чего-то» в 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);
to
var store = collection.GetService<WorkItemStore>();
он может сохранить без каких-либо проблем! Но в этом случае я не знаю, как установить BypassRules
в true
. Это свойство доступно только для чтения при создании объекта WorkItemStore
, и я получаю ошибки проверки, если пытаюсь установить для шага рабочего процесса значение, отличное от «Новый».
Итак, мой основной вопрос: как создавать рабочие элементы в TFS через API и иметь возможность изменять поле State
в этом вновь созданном элементе?