我可以通过以下方式成功创建迭代路径:
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);
但是,当我尝试将此路径分配给工作项并保存时,该字段不会验证。
如果我再次运行测试(已经创建了迭代),则相同的代码会成功。
有人知道如何使这项工作吗?
答案 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 sprint
到MyTeamProject\my sprint
。
希望这可以节省一些时间。
注意:我是针对TFS 2013运行的。
答案 2 :(得分:0)
您可能遇到了缓存问题。创建迭代后尝试清除缓存。你可以试试几件事:
如果不是这样,请发布您的代码,我会看看是否可以重现它。
答案 3 :(得分:0)
我有类似的问题。我创建了Areapath,然后创建了一个使用AreaPath的查询。我确实调用了store.RefreshCashe()但它没有用。仅在调试器中,当我手动运行store.RefreshCashe()两次时。 谢谢“Yan Sklyarenko”。我尝试了你的建议,它工作正常(TFS Server 2012)。