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

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 thoughts on “[TFS2010] HowTo: Crear un WorkItem con campos personalizados en C#

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.