image47dd1de4

Buenas,

si bien el modelo de objetos para Visual Studio 2010 para trabajar con Team Foundation Server 2010 no es muy complejo, hay algunas particularidades a tener en cuenta. Por ejemplo, cuando queremos crear un WorkItem al que le hemos modificado su estructura de campos.

Por ejemplo, para la definición de una tarea hemos agregado 2 campos de texto más a la misma, llamados “Version” y “Scope”, y luego los hemos agregado visualmente al formulario de edición (si quieres ver como es posible realizar este cambio, este post es para ti). En al siguiente imagen es posible ver como el campo “versión” es requerido para la creación de una tarea.

image

Si tomamos el ejemplo disponible desde MSDN para la creaciòn de un WorkItem utilizando el Client Object Model, veremos que en el mismo no se tiene en cuenta la utilización de campos personalizados. Modificamos el mismo para que guarde los datos de una tarea, como muestra el siguiente código:

   1: using System;

   2: using Microsoft.TeamFoundation.Client;

   3: using Microsoft.TeamFoundation.WorkItemTracking.Client;

   4:  

   5: namespace ElBruno.CreateWiFromCode

   6: {

   7:     class Program

   8:     {

   9:         static void Main(string[] args)

  10:         {

  11:             var collectionUri = new Uri("http://localhost:8080/tfs/tpb");

  12:             var tpc = new TfsTeamProjectCollection(collectionUri);

  13:             var workItemStore = tpc.GetService<WorkItemStore>();

  14:             var teamProject = workItemStore.Projects["AgileLabs"];

  15:             var workItemType = teamProject.WorkItemTypes["Task"];

  16:  

  17:             var task = new WorkItem(workItemType)

  18:             {

  19:                 Title = "Sample Title",

  20:                 Description = "Sample desc"

  21:             };

  22:             task.Save();

  23:  

  24:             Console.WriteLine(@"WorkItem id: " + task.Id);

  25:             Console.ReadLine();

  26:         }

  27:     }

  28: }

 

 

Cuando se quiere guardar el WI (línea 22), nos encontramos con la siguiente excepción:

image

   1: Microsoft.TeamFoundation.WorkItemTracking.Client.ValidationException was unhandled

   2:   Message=TF237124: Work Item is not ready to save

   3:   Source=Microsoft.TeamFoundation.WorkItemTracking.Client

   4:   IsRemoteException=false

   5:   ErrorId=0

   6:   LogException=false

   7:   StackTrace:

   8:        at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.Save(SaveFlags saveFlags)

   9:        at Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem.Save()

  10:        at ElBruno.CreateWiFromCode.Program.Main(String[] args) in 

  11:        at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)

  12:        at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

  13:        at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

  14:        at System.Threading.ThreadHelper.ThreadStart_Context(Object state)

  15:        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)

  16:        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

  17:        at System.Threading.ThreadHelper.ThreadStart()

  18:   InnerException: 

La solución consiste en definir el valor del campo “version” para poder de esta forma cumplir con los campos requeridos para la tarea. Una de las formas posibles de ver el estado de un WI, es analizando el campo IsDirty del mismo. Para este caso podemos realizar la siguiente validación

   1: var task = new WorkItem(workItemType)

   2: {

   3:     Title = "Sample Title",

   4:     Description = "Sample desc"

   5: };

   6: if(task.IsDirty)

   7:     Console.WriteLine("Can't save WorkItem");

   8: else

   9:     task.Save();

 

El objetivo del post era explicar como agregar valores a los campos personalizados, en este caso la magia la realiza una vez más, la línea 22.

   1: using System;

   2: using Microsoft.TeamFoundation.Client;

   3: using Microsoft.TeamFoundation.WorkItemTracking.Client;

   4:  

   5: namespace ElBruno.CreateWiFromCode

   6: {

   7:     class Program

   8:     {

   9:         static void Main(string[] args)

  10:         {

  11:             var collectionUri = new Uri("http://localhost:8080/tfs/tpb");

  12:             var tpc = new TfsTeamProjectCollection(collectionUri);

  13:             var workItemStore = tpc.GetService<WorkItemStore>();

  14:             var teamProject = workItemStore.Projects["AgileLabs"];

  15:             var workItemType = teamProject.WorkItemTypes["Task"];

  16:  

  17:             var task = new WorkItem(workItemType)

  18:             {

  19:                 Title = "Sample Title",

  20:                 Description = "Sample desc"

  21:             };

  22:             task.Fields["ElBruno.Version"].Value = "version 01";

  23:             task.Save();

  24:  

  25:             Console.WriteLine(@"WorkItem id: " + task.Id);

  26:             Console.ReadLine();

  27:         }

  28:     }

  29: }

 

 

Saludos @ Here

El Bruno

   

Fuente: http://msdn.microsoft.com/en-us/library/bb130322.aspx#Y697

2 responses to “[TFS2010] HowTo: Crear un WorkItem con campos personalizados en C#”

  1. […] [TFS2010] HowTo: Crear un WorkItem con campos personalizados en C# […]

    Like

  2. Thanks men! You save my life! 😛

    Like

Leave a comment

Discover more from El Bruno

Subscribe now to keep reading and get access to the full archive.

Continue reading