在新创建的迭代上保存WorkItem#IterationPath

时间:2010-05-20 20:35:50

标签: c# tfs iteration workitem

我可以通过以下方式成功创建迭代路径:

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

但是,当我尝试将此路径分配给工作项并保存时,该字段不会验证。

如果我再次运行测试(已经创建了迭代),则相同的代码会成功。

有人知道如何使这项工作吗?

4 个答案:

答案 0 :(得分:3)

这为我解决了这个问题:

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

也许它会帮助别人。

答案 1 :(得分: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中的缓存(我怀疑这类似于在Web界面中按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 sprintMyTeamProject\my sprint

希望这可以节省一些时间。

注意:我是针对TFS 2013运行的。

答案 2 :(得分:0)

您可能遇到了缓存问题。创建迭代后尝试清除缓存。你可以试试几件事:

  1. 获取WorkItemStore的新副本。
  2. 断开并重新连接到TFS
  3. 检查WIS或TFS服务器对象上是否有“刷新”方法。我已经关闭了我的TFS开发实例,我不记得是否有类似的东西。
  4. 如果不是这样,请发布您的代码,我会看看是否可以重现它。

答案 3 :(得分:0)

我有类似的问题。我创建了Areapath,然后创建了一个使用AreaPath的查询。我确实调用了store.RefreshCashe()但它没有用。仅在调试器中,当我手动运行store.RefreshCashe()两次时。 谢谢“Yan Sklyarenko”。我尝试了你的建议,它工作正常(TFS Server 2012)。