jueves, 20 de diciembre de 2012

Migrando de TFS11Beta a TFS2012 with Update 1

Ha llegado el momento ineludible y me pongo a migrar un TFS11Beta de producción – si, ya sé que no debiera – a un TFS2012.

Primer escollo, no se puede instalar un TFS2012 actualizando un TFS11 Beta. Hay que desinstalar el TFS11Beta antes. Lo cual – menos mal que tengo todo en máquinas virtuales – implica hacer una backup en forma de snapshot de la máquina virtual.

Segundo escollo NO SE PUEDE ACTUALIZAR HASTA UN TFS2012 con UPDATE1… debes primero actualizar al TFS2012 y después aplicarle el Update1.

Asegurado que no voy a perder más de una hora en volver al punto anterior, desinstalo el TFS11 Beta. Y, sin necesidad de reiniciar la máquina, me pongo a instalar desde la Web el TFS2012.

image

Al instalar el .NET 4.5 pide un reinicio inmediato… es decir que se reinicia en cuanto pulses OK. Al volver al sistema continua guardando en local los ficheros de instalación. (Tal vez debiera haberme tirado del todo al rio y haber actualizado el Windows 2008 server R2 a un Windows 2012 Server, lo cual puede dar para otro artículo). Y, finalmente se pone a instalar – sin preguntarme aún si quiero actualizar.

Me pide el número de serie, y cómo no lo tengo a mano, le digo que me ponga un Trial de 90 días. A lo cual me abre el Configuration Center y selecciono Upgrade y Start Wizard.

image

Lo primero que me pregunta es cual es la base de datos de TFS que voy a actualizar. Para comprobar que es la correcta pulso en el enlace de List Available Databases y me tiene que salir, como poco, la de Tfs_configuration. Además, ya que estoy utilizando un snapshot como copia de seguridad, hago check en la casilla inferior en donde le digo que tengo un backup actual.

image

La siguiente pantalla trata de la cuenta de servicio que voy a utilizar para mi Application-Tier, la cual (por si no te acuerdas) debería ser algo como TFSSERVICE. No es buena práctica utilizar una cuenta de sistema.

image

Continuamos con la configuración del Reporting Server en donde le indico cual es el servidor que voy a utilizar y le doy al enlace de Populate URLs para que me añada el solito las URL adecuadas.

image

Ahora empezamos con chicha, le tengo que indicar cual es la base de datos que soporta el Team Foundation Warehouse. Lo pruebo pinchando en el enlace de Test y a continuación compruebo las bases de datos pinchando en el enlace List Avaliable Databases. Al menos debe aparecer una.

image

Continuamos indicando cual es la base de datos que soporta los Analisys Services, y comprobamos su correcto funcionamiento pinchado en Test.

image

Continuamos por la configuración de la cuenta de servicio que va a ser utilizada para contactar con el servidor de Reportes, la cual no debiera ser de sistema y debería ser algo como TFSREPORT.

image

Ahora configuremos el acceso a SharePoint para los portales de los proyectos, lo cual es muy sencillo: los dejo como estaba.

image

Ahora nos vamos a la pantalla de Review y lanzamos la verificación de todos los datos que hemos introducido.

image

Aquí me salto la alerta avisándome que no se podía actualizar la base de datos y, buscando en internet, encontré que era a causa de que no se puede actualizar directamente de TFS11 beta TFS2012 con Update 1. Hay que pasar primero por TFS2012 normal, que puedes encontrar aquí: Team Foundation Server 2012 without Update 1 en el enlace superior derecho, no en el listado de TFS a descargar.

Le doy a verificar y, si todo está correcto, deberían salir todos verdes.

image

Le damos al botón Configure, y se pone a configurar el TFS2012 en la base de datos y a hacer sus cosas raras que hace por dentro. Es el momento de la verdad, si algo rompe aquí la cosa va a pintar bastos.

image

Y después de un rato de redoble de tambores… tachan!!! Lo que estaba esperando de agua de Mayo: la pantalla de Sucess. La alerta que me sale es que no se puede cambiar el grupo Contributor de SharePoint, lo cual está bien.

image

Ahora a por el Update 1, pero eso será otro artículo (si merece la pena).

martes, 18 de diciembre de 2012

Recargar un ListView navegando con un Back()

Primero un Disclamer: lo que estoy haciendo no es el modo correcto. Me he saltado, por causas justificadas, el uso de MVVM y lo he hecho al estilo “mero macho”: en code behind.

Tengo una página de listado de usuarios, cuando pulso en el botón más me voy a un formulario de alta de un nuevo usuario. Pero, como accedo a esa página desde varios sitios, utilizo GoBack() para volver a la página anterior en el historial de navegación.

image
Listado inicial

image
Alta de un nuevo usuario

El problema viene cuando acabo de añadir un usuario y vuelvo a la página de la Lista de Usuarios, que no se me ha actualizado, ya que tira de caché.

image
Ups, no se actualiza

Dándole vueltas he llegado a una solución imperfecta, pero que me vale. La asignación del datocontext de la página en vez de hacerlo en el constructor de la página, lo realizo en el evento de carga.

    public partial class ListadoUsuarios :Page
  
{
      
public ListadoUsuarios()
        {
            InitializeComponent();
            Loaded += ListadoUsuarios_Loaded;
        }

      
void ListadoUsuarios_Loaded(object sender,RoutedEventArgs e)
        {
          
VMLocator locator =newVMLocator();
          
this.DataContext = locator.ListadoUsuariosViewModel;
        }

   
}

De esta forma me aseguro, llegue como llegue a esta página, que se me recargue el Listado de Usuarios.

image
Ahora si que se actualiza siempre.

P.D. Olvídate de la clase VMLocator, lo importante es cómo creas el ViewModel y la propiedad pública que utilices para el DataContext de la página.

lunes, 10 de diciembre de 2012

WPF. Al declarar el DataContext a un control da error de referencia nula

Este es uno de esos errores “tontos” que provocan que pierdas un montón de tiempo mientras estás aprendiendo a trabajar con WPF.

Tengo la siguiente declaración que, cuando llega a cargar el datacontext del control ListView, me da un error de referencia de objeto nula.

public DetalleCliente(Clientes cliente)
{
     
DetalleClienteViewModel viewModel = new DetalleClienteViewModel(cliente);
     
this.DataContext = viewModel.Cliente;
      ListView.ItemsSource = viewModel.Suscripciones;
      InitializeComponent();
}

¿Has encontrado ya el problema?

Es facil cuando te alejas y empiezas a depurar en la mente:

1. Instancio la clase viewmodel.
2. A this, le digo que su datacontext es la propiedad Cliente de viewmodel.
3. A ListView le digo que el source de los item es la propiedad Suscripciones del viewmodel… de aquí no pasa!!

Espera, ListView es un control, y los controles se inicializan con la orden InitializeComponent(). Por lo cual estoy intentando asignar el datasource a un control que aún no ha sido instanciado, por lo cual me devuelve un error de objeto nulo.

Cambiando para que inicialice la página y sus controles se arregla todo.

public DetalleCliente(Clientes cliente)
{

      InitializeComponent();

      DetalleClienteViewModel viewModel = new DetalleClienteViewModel(cliente);
     
this.DataContext = viewModel.Cliente;
      ListView.ItemsSource = viewModel.Suscripciones;
}

Espero que sirva de ayuda.