2010-05-20 35 views
4

Je peux créer avec succès un chemin d'itération via:Saving WorkItem # IterationPath sur nouvellement créé Iteration

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

Cependant, quand je tente de céder ce chemin à un élément de travail et enregistrez-le champ ne valide pas.

Si je réexécute les tests (avec l'itération déjà créée), le même code réussit.

Est-ce que quelqu'un sait comment faire ce travail?

Répondre

0

Vous rencontrez probablement un problème de mise en cache. Essayez d'effacer le cache après avoir créé l'itération. Quelques choses que vous pourriez essayer:

  1. Obtenez une nouvelle copie de WorkItemStore.
  2. Déconnecter et reconnecter à TFS
  3. Vérifiez s'il existe une méthode «refresh» sur le WIS ou sur les objets du serveur TFS. J'ai fermé mon instance de dev de TFS pour la nuit, et je ne me souviens pas s'il y a quelque chose comme ça.

Si ce n'est pas tout à fait cela, postez votre code et je verrai si je peux le reproduire.

3

Ce qu'il fixe pour moi:

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

Peut-être que cela aidera quelqu'un.

2

J'ai rencontré exactement le même comportement, et malheureusement la réponse @JWC n'a pas aidé. La solution qui fonctionne pour moi peut être trouvée par this link. Donc, ceci est un résumé rapide au cas où la réponse originale serait perdue.

Le point clé est d'utiliser la classe WorkItemServer. Il réside dans l'assemblage Microsoft.TeamFoundation.WorkItemTracking.Proxy.dll.

Tout d'abord, vous créez une instance WorkItemStore:

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

Ensuite, créez des chemins d'itération nécessaires:

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

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

Ensuite, rafraîchir le cache dans TFS (je soupçonne que ce qui est similaire à appuyer sur F5 dans l'interface web):

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

Et enfin , affectez l'élément de travail nouvellement créé à l'itération nouvellement créée:

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

C'est tout! La méthode FormatPath traduit le chemin d'itération à la forme requise par le champ de travail IterationPath, c'est-à-dire de \MyTeamProject\Iteration\my sprint à MyTeamProject\my sprint.

Espérons que cela peut faire gagner du temps.

NOTE: Je cours ceci vers TFS 2013.

0

J'ai eu le même problème. J'ai créé Areapath et ensuite créé une requête où le AreaPath a été utilisé. J'ai appelé store.RefreshCashe() mais cela n'a pas fonctionné. Seulement dans le débogueur lorsque je lance store.RefreshCashe() deux fois manuellement. Merci "Yan Sklyarenko". J'ai essayé votre Suggestion et cela fonctionne très bien (TFS Server 2012).