1

我正在创建一个从“某物”到 TFS 2013 的工作项迁移应用程序,并且我希望 TFS 工作项处于与源系统中相应的工作流状态。例如,如果源工作项处于“关闭”状态,我希望它在 TFS 中处于“完成”状态。

我已遵循本文中的建议,建议将对象的BypassRules属性设置为以便能够设置字段。我想,这同样适用于更改工作流状态,因为它也需要绕过规则。WorkItemStoretrueCreatedDate

所以,我尝试了以下方法:

// 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是否设置为正确。此外,也是。trueSave()workItem.IsValidtrue

有趣的事实是,如果我改变获取WorkItemStore对象的方式,从

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

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

它可以毫无问题地保存!但在这种情况下,我不知道如何设置BypassRulestrue. 此属性在创建对象时是只读的WorkItemStore,如果我尝试将工作流步骤设置为“新建”以外的其他内容,则会出现验证错误。

所以,我的基本问题是:如何通过 API 在 TFS 中创建工作项并能够更改State这个新创建的项目中的字段?

4

1 回答 1

4

好吧,伙计们,就像经常发生的那样,答案是手动的。让我解释。

我在问题中引用的文章清楚地指出:

您需要成为项目收集服务帐户的成员

但它没有提到您不能轻松地将用户或组添加到Project Collection Service Accounts. 如果您尝试通过 Web 访问执行此操作,您将失败 - 添加按钮被禁用。此外,屏幕截图具有误导性,显示一个帐户为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)

于 2013-11-15T17:50:37.540 回答