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

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...

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...

SQLServer Stored Procedure Para Ordenar Columnas Ascendente / Descendente

Pues este es nuestro primer post referente a SQLServer ... En primera instancia les queremos platicar qué es lo que buscamos:  Mediante un stored procedure obtener un listado ordenado por alguna de las columnas devueltas de manera ascendente o descendente, dependiendo de los parámetros de entrada del mismo. Muchas de las ocasiones cuando nos ha tocado buscar información acerca de cómo hacer este proceso, solemos encontrar recomendaciones de hacerlo usando un query que se contruye en tiempo de ejecución usando una variable de tipo VARCHAR(MAX) y después hacer uso de la función EXEC para ejecutarlo. Al final, se resuelve el problema, pero la intención es mejorar el procedimiento sin afectar el rendimiento y evitando problemas de seguridad como el SQL Injection . Veamos un video con una propuesta diferente de resolución de este requerimiento: Creación de la Base de Datos Usando el siguiente query que pueden ejecutar en el cliente base de datos SQL Server creare...