La situación a la que nos afrontamos es que al momento de llevar una actualización de nuestra aplicación del Sistema Integral de Negocios desarrollada en WPF y publicada usando ClickOnce era que podíamos sin ningún inconveniente el poner la nueva versión disponible en un sitio web y al momento de iniciarla por alguno de nuestros clientes, esta se actualizaba y contaban con la nueva versión.
Pero... ¿Qué pasa si el modelo de datos sufría cambios? En un principio íbamos a las instalaciones de nuestros clientes a llevar a cabo de manera presencial dichos cambios y listo, todo fluía.
Al incrementar el número de clientes, dichas actualizaciones se hicieron tediosas, así que optamos por solicitar acceso por medio de una vpn en el mejor de los casos o por medio de team viewer, que pues de alguna forma nos facilitó el trabajo, pero no dejaba de ser tedioso.
La propuesta para mejorar este proceso fue la de incluir un archivo en el que capturáramos los queries sql necesarios para poder llevar a cabo la actualización del modelo de datos y una vez hecho que dicho archivo se eliminara.
La aplicación tuvimos que modificarla para que al inicio de la misma validara la existencia de dicho archivo, lo leyera y ejecutara línea por línea y una vez hecho esto, eliminara el archivo para que en un inicio posterior no hubiera datos que actualizar.
Esto en un principio puede ser hecho sin ningún inconveniente usando ADO.Net, pero si nuestra aplicación realiza el acceso a datos por medio de Entity Framework ¿por qué no hacer uso de la infraestructura de acceso a datos que dicha tecnología nos provee?
Espero y no te hayas aburrido leyendo la problemática, por alguna extraña razón ya no nos gusta leer y queremos la solución inmediata, pero al final los escenarios del mundo real nos permiten ahondar un poco en la forma que tenemos para solventar dichos inconvenientes.
A continuación podrás ver un video con la propuesta de solución de la problemática descrita anteriormente.
La Solución de Ejemplo
Es un proyecto WFC con una etiqueta en el centro de un formulario principal:
La solución está conformada principalmente por los siguientes elementos:
- EntityDataModel que en este caso lo nombramos como: EDMPrueba.edmx
- El archivo: update.sql
Este último archivo es muy importante dentro de nuestra demostración, ya que cada línea que contiene es un query a ejecutar en la base de datos.
Las propiedades del archivo deberán estar configuradas de la siguiente forma:
- Acción de compilación: Contenido
- Copiar en el directorio de salida: Copiar si es posterior
Para nuestro ejemplo, el EDM solo tiene una tabla, esto para hacerlo lo más simple posible, pero a la ves que cumpla con el objetivo de entender cómo llevar a cabo la actualización del modelo de datos usando ClickOnce.
El Método Mágico
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /// <summary> /// Método de actualización de la base de datos /// </summary> /// <returns>Resultado de la operación</returns> public bool ActualizarBaseDatos() { bool resultado = false; try { string path = AppDomain.CurrentDomain.BaseDirectory + @"\update.sql"; if (File.Exists(path)) { MessageBox.Show("Comienza la actualización"); using (BlogspotEntities db = new BlogspotEntities()) { foreach (string query in File.ReadAllLines(path)) { MessageBox.Show(query); db.Database.ExecuteSqlCommand(query); } MessageBox.Show("Elimina el archivo"); File.Delete(path); } MessageBox.Show("Actualización finalizada correctamente"); resultado = true; } } catch (Exception ex) { lblBienvenida.Content = ex.Message; } return resultado; } |
- Obtiene de la ruta de la aplicación el archivo update.sql
- Si existe manda un mensaje de inicio de la actualización
- Inicia el contexto de EF
- Recorre cada línea del archivo y la ejecuta usando el contexto de EF
- Una vez finalizada la actualización, elimina el archivo
La descarga incluye la solución y el script de creación de la base de datos, que te recomendamos generar con un SQL Express y si usas la instancia default debería funcionar sin ningún inconveniente, en caso contrario, deberás modificar la connection string en el app config para que cumpla con las características de tu servidor de base de datos.
Comentarios
Publicar un comentario