Ir al contenido principal

Ejecutar Queries Usando Entity Framework

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:

  1. EntityDataModel que en este caso lo nombramos como: EDMPrueba.edmx
  2. 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;
}

  1. Obtiene de la ruta de la aplicación el archivo update.sql
  2. Si existe manda un mensaje de inicio de la actualización
  3. Inicia el contexto de EF
  4. Recorre cada línea del archivo y la ejecuta usando el contexto de EF
  5. Una vez finalizada la actualización, elimina el archivo
Descarga de la Solución

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

Entradas más populares de este blog

Validación de Fechas con jQuery Validator

Al validar fechas con jQuery Validate nos encontramos con el problema de que dicha validación se hace en formato: MM/DD/YYYY, esto es correcto, pero no tanto para formato de fechas de México al menos que es más común para nosotros hacerlo de manera que dicho formato sea: DD/MM/YYYY. Para poder solucionar este problema haremos algunas modificaciones en las librerías: jquery.validate.js jquery.validate.min.js Veamos el siguiente video para la implementación de dicha solución: jquery.validate.js Se deja comentado el cómo se hace la validación original y se adiciona el código personalizado que permite validar el formato de fecha del tipo: DD/MM/YYYY 1 2 3 4 5 6 7 8 9 10 11 // http://jqueryvalidation.org/date-method/ // Nivisix Soluciones: personalización para formato de fechas DD/MM/YYYY date : function ( value, element ) { //return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() ); var com...

Publicación de WCF en Net.TCP

Una de las grandes características de WCF es la forma en como éstos pueden ser expuestos a nuestros clientes, por ejemplo los siguientes protocolos, de manera muy recurrente: Http TCP Net Pipe ¿Sabes en que casos usar cada uno? Http cuando el servicio y el cliente se encuentran en redes diferentes TCP cuando el servicio y el cliente se encuentran en la misma red, pero en equipos diferentes Net Pipe cuando el servicio y el cliente se encuentran alojados en el mismo equipo ¿Por qué razón? Por cuestiones de redimiento y seguridad de la información Si una petición http toma un tiempo de 200 ms, por poner un ejemplo Una petición tcp tomará aproximadamente el 20% menos que la petición http (40 ms aproximadamente) Y una petición Net Pipe , tomará aproximadamente el 80% del tiempo que toma el hacer una petición tcp (32 ms aproximadamente) Para mayor entendimiento, chequen este post que alguna vez consultamos para entender un poco más acerca de éstos conceptos: https://j...

.NET ClickOnce y Privilegios de Administrador

Estaba revisando que no publicábamos nada desde Julio de 2017 y pues ya pasó algo de tiempo, podemos decir que afortunadamente hemos tenido un poco de trabajo que no nos ha permitido retomar este asunto de los posts. Una Pequeña Introducción Uno de nuestros proyectos más importantes dentro de Nivisix es el Sistema de Punto de Venta, puesto que de primera instancia lo vendemos a nuestros clientes y posteriormente nos solicitan personalizaciones del mismo de acuerdo a sus necesidades. Y las liberaciones a veces se tornan un tanto complicadas por que en un inicio eran en sitio y posteriormente usando herramientas como Team Viewer y si en su momento compraban el servicio de implementación de VPN pues que mejor. Lo anterior está muy bien, ¿pero porqué no hacer uso de lo que Microsoft desde hace algunos años nos ofrece y que puede solucionar este problema de actualización? Hablo específicamente del uso de ClickOnce como herramienta de liberación y actualización de aplicaciones...