Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Saving WorkItem#IterationPath on newly created Iteration

I can successfully create an iteration path via:

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

However, when I try and assign this path to a work item and save it the field doesn't validate.

If I run the tests again (with the iteration already created) the same code succeeds.

Does anybody know how to make this work?

like image 550
Keynan Avatar asked May 20 '10 20:05

Keynan


2 Answers

This fixed it for me:

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

Maybe it will help someone.

like image 173
JWC Avatar answered Nov 03 '22 22:11

JWC


I experienced exactly the same behavior, and unfortunately @JWC answer didn't help. The solution which works for me can be found by this link.

So, this is a quick summary in case the original answer gets lost.

The key point is to use WorkItemServer class. It lives in the Microsoft.TeamFoundation.WorkItemTracking.Proxy.dll assembly.

First of all, you create a WorkItemStore instance:

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

Then, create necessary iteration paths:

var commonservice = collection.GetService<ICommonStructureService>();

var iterationRoot = commonservice.GetNodeFromPath("\\MyTeamProject\\Iteration");
var newIterationPath = commonservice.CreateNode("my sprint", iterationRoot.Uri);

Next, refresh the cache in TFS (I suspect this is similar to pressing F5 in web interface):

var wiServer = collection.GetService<WorkItemServer>();
wiServer.SyncExternalStructures(WorkItemServer.NewRequestId(), commonservice.GetProjectFromName("MyTeamProject").Uri);
store.RefreshCache();

And finally, assign newly created work item to the newly created iteration:

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

That's it! The method FormatPath translates the iteration path to the form required by the work item IterationPath field, that is from \MyTeamProject\Iteration\my sprint to MyTeamProject\my sprint.

Hope this can save some time.

NOTE: I run this towards TFS 2013.

like image 31
Yan Sklyarenko Avatar answered Nov 04 '22 00:11

Yan Sklyarenko