Autor: Roberto Miranda

  • Establecer Environment Variable en Package Manager Console

    Hola amigos, en este caso me encontraba trabajando con un proyecto en Visual Studio 2022 que tengo divido diversas capas, una es la Data Access Layer (DAL) o capa d de acceso a datos, dicha capa es la encargada de manejar el contexto para Entity Framework Core.

    El problema es que tengo un connection string para local y otro para Release que a su vez se obtiene desde otro proyecto (Web API), el código es el siguiente:

     public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
     {
         public ApplicationDbContext CreateDbContext(string[] args)
         {
    
             bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";
    
             var connectionStringDev = "/../DiarioWebAPI/appsettings.json";
             var connectionStringRelease = "/../DiarioWebAPI/appsettings.Release.json";
     
             var connection = isDevelopment ? connectionStringDev : connectionStringRelease;
    
    
             IConfigurationRoot configuration = new ConfigurationBuilder()
                 .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile(@Directory.GetCurrentDirectory() + connection).Build();
             var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
             var connectionString = configuration.GetSection("ConnectionStrings")["defaultConnection"];
             builder.UseSqlServer(connectionString);
             return new ApplicationDbContext(builder.Options);
              
         }
    
    
     }
    

    Como podemos ver, dependiendo el valor de [ASPNETCORE_ENVIRONMENT] tomara la configuración de uno u otro archivo, al hacer un despliegue o publish, esta variable se puede establecer muy fácilmente, sin embargo, no sabía cómo realizarlo en la Package Manager Console, lo cual simplemente se resuelve ejecutando el siguiente comando, sea para development, production etc:

    PM> $env:ASPNETCORE_ENVIRONMENT='Production'
    PM> $env:ASPNETCORE_ENVIRONMENT='Development'

    Después de esto, mi comando add-migration y posteriormente updata-database funcionó correctamente con las cadenas de conexión adecuadas.

  • Copiar archivos de un contenedor de Docker en Ubuntu

    Hola amigos, en esta ocasión tengo la necesidad de copiar un respaldo de una base de datos de SQL Server que se encuentra en un contenedor de Docker a mi VPS que es un SO Ubuntu 23.04

    Como podemos ver, tengo un solo contenedor haciendo uso del comando:

    $ docker ps

    Anteriormente accedí al path donde copiaré mi archivo e hice un ls para ver que efectivamente esta vacío.

    Luego usando un comando como el siguiente, podemos copiar de una ruta del contedor a una local.

    docker cp ID_CONTENEDOR:RUTA_DEL_CONTENEDOR RUTA_LOCAL
    

    Y en mi caso quedaría así

    docker cp 466ae2e5db3d:/var/opt/mssql/data/diario.bak /var/opt
    

    Dependiendo de su usuario, configuraciones y permisos, tal vez sea necesario añadir el comando sudo para elevar permisos.

    Ahora si haciendo un ls podemos ver que efectivamente realizó la copia.

    Como dato extra añado un ejemplo de como sería de manera inversa, de nuestro servidor a un contenedor.

    docker cp RUTA_LOCAL ID_CONTENEDOR:RUTA_DEL_CONTENEDOR
    

  • Error «npm no se reconoce como un comando interno o externo»

    Hola amigos, en esta ocasión me encontraba agregando un proyecto de angular a mi solución en Visual Studio 2022 que contenía otros proyectos como una Web API y biblioteca de clases, al instalar Node JS y Angular y hacer un BUILD inicial a mi proyecto de Angular desde VS, me mostró el siguiente error:

    «npm» no se reconoce como un comando interno o externo.

    Por lo cual googleando lo resolví de la siguiente manera en Windows 11:

    • Ir a Configuración > Sistema > Configuración avanzada del sistema

    Nos vamos a la pestaña Opciones avanzadas y al final viene la opción «Variables de Entorno»

    Nos vamos a la opción de Path y le damos editar, añadimos una Nueva línea con el siguiente dato que es la ruta de instalación de nodejs:

    C:\Archivos de programa\nodejs\

    Y nos quedará algo como esto:

    Ahora guardamos todos los cambios y tu proyecto se ejecutará sin problemas, es recomendable reiniciar, pero a mí me funcionó sin reiniciar mi equipo.

  • Construyendo una Web API en .Net y C# – Parte 2

    Construyendo una Web API en .Net y C# – Parte 2

    Hola en este tutorial dividido en diferentes partes aprenderás como implementar una aplicación de web api con C# de manera sencilla y rápida.

    La web API consiste en crear un servicio de consulta por código postal de la república mexicana para obtener información de colonias, municipios, estado, ciudad etcétera.

    Algunos de los temas que veremos.

    • Web API
    • SQL Managmente Studio
    • Importación masiva de datos con SQL MS
    • PostMan
    • Data Annotations
    • Seguridad con Json Web Tokens (JWT).

    Importando información de un XLS a la base de datos

    Hay muchas maneras de importar data, en este caso usaremos la herramienta nativa de SQL Managment.

    Nos dirigimos a nuestro SQL Management Studio y seleccionamos nuestra base de datos y damos clic derecho y nos luego a Task/Tareas, finalmente damos click en Import data, se nos abrirá la siguiente ventana con una serie de pasos.

    En la primer ventana donde seleccionamos el origen de datos buscamos Microsoft Excel y seleccionamos nuestro archivo, la versión la dejamos en 2003.

    En la siguiente ventana seleccionaremos el destino el cual será SQL Server Native Client.

    El siguiente venta a configurar tendremos que mapear la hoja de excel de nuestra tabla ya creada, tengan cuidado por que en la columna destino les tratará de crear una nueva tabla como se llama la hoja de excel, le daremos en editar asignaciones para mapear los campos.

    Le damos siguiente y dejamos todo por default hasta llegar el final y si todo sale bien no generará ningún error.

    La inserción es demasiada rápida, no debería tardar más de 5 segundos

    Creando nuestro controlador

    Vamos a dirigirnos a la carpeta Controllers y daremos click derecho -> Agregar controlador

    Nos vamos a Común -> API y seleccionamos: Controlador de API con acciones que usan Entity Framework

    Seleccionamos los siguientes parámetros y renombramos el controlador a CodigosPostalesController

    y le damos en agregar y nos creara un archivo con  todos los verbos/métodos.

    Probando el controlador

    Agregamos un registro de prueba en nuestra tabla, luego volvemos a nuestro visual studio e iniciamos la depuración, probamos la url de nuestro api 

    /api/CodigosPostales
    

    Como podemos ver ya nos esta regresando nuestra información.

    Probando en Postman

    Abrimos nuestra aplicación y agregamos una nueva colección para las futuras pruebas que estaremos realizando.

    Agregamos una nueva solicitud, Add Request, basta poner el método GET y la url.

    Seguridad

    El paso siguiente será añadir seguridad a nuestra web api con JWT Tokens

  • Construyendo una Web API en .Net y C# – Parte 1

    Construyendo una Web API en .Net y C# – Parte 1

    Hola en este tutorial dividido en diferentes partes aprenderás como implementar una aplicación de web api con C# de manera sencilla y rápida.

    La web API consiste en crear un servicio de consulta por código postal de la república mexicana para obtener información de colonias, municipios, estado, ciudad etcétera.

    Algunos de los temas que veremos.

    • Web API
    • SQL Managmente Studio
    • Importación masiva de datos con SQL MS
    • PostMan
    • Data Annotations
    • Seguridad con Json Web Tokens (JWT).

    Descargar XLS SEPOMEX

    Descargaremos el archivo xls donde se encuentran todos los códigos postales de la republica mexicana, podemos escoger por estado en especifico o descargar todos
    https://www.correosdemexico.gob.mx/SSLServicios/ConsultaCP/CodigoPostal_Exportar.aspx

    Una vez descargado el archivo podemos ver que tiene múltiples columnas, dependiendo el proyecto podemos usar todas, en nuestro caso solo usaremos algunas.

    Creando el Modelo

    Del archivo xls solo utilizaremos las primeras columnas y las propiedades las nombraremos con nombres más amigables.

    Creamos un folder llamado Models 

    Creamos una clase modelo llamada CodigosPostalesModel y añadimos el siguiente código.

    Usaremos Data Annotations para los atributos que forzaran algunas propiedades  también la clave primaria.

        public class CodigosPostalesModel
        {
            [Key]
            public int CodigoPostalId { get; set; }
            [Required]
            public string CodigoPostal { get; set; }
            [Required]
            public string Asentamiento { get; set; }
            public string Municipio { get; set; }
            [Required]
            public string Estado { get; set; }
            public string Ciudad { get; set; }
        }
    

    Creando la DAL (Data Access Layer)

    Ahora necesitamos crear nuestra base de datos y en C# crear la capa de acceso de datos que es el contexto para crear las entidades de SQL a C#.

    Abrimos SQL Managment y creamos nuestra base de datos llamada: ApiSepomex

     En nuestro visual studio nos vamos al menú herramientas > Administrador de paquetes NuGet  > Administrar  paquetes NuGet para la solución, se nos abrirá una ventana en la cual podemos buscar paquetes, agregamos los paquetes NuGet:

    Microsoft.EntityFrameworkCore.SqlServer
    Microsoft.EntityFrameworkCore 
    

    Creamos una carpeta en la raíz de nuestro proyecto y la nombramos como DAL

    Para crear el contexto añadimos una clase llamada CodigosPostalesContext

    Añadimos las referencias de EntityFramework y nuestra clase modelo con las siguientes dependencias, podemos eliminar las que no necesitemos.

    using Microsoft.EntityFrameworkCore;
    using TodoApi.Models;
    

    Añadimos el siguiente código el cual es el constructor del contexto con inyección de dependencias y añadimos el DbSet como propiedad para nuestra entidad, al añadir esta propiedad al ejecutar nuestro comando de migración, creará dicha tabla.

     public CodigosPostalesContext(DbContextOptions<CodigosPostalesContext> options) : base(options)
        {
        }
        public DbSet<CodigosPostalesModel> CodigosPostales { get; set; }
    

    Quitamos todos los using innecesarios

    Haciendo inyección de dependencias

    Abrimos el archivo Startup.cs y añadimos la siguiente linea en nuestro método ConfigureServices

    services.AddDbContext<CodigosPostalesContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    

    Tendría que quedarnos algo así:

    public void ConfigureServices(IServiceCollection services)
    {
    services.AddDbContext<CodigosPostalesContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
    services.AddControllers();
    } 
    

    Lo anterior especifica que tendremos acceso en toda nuestra aplicación y además estamos especificando que usaremos SQL Server y pasamos la cadena de conexión, dicha cadena  se encuentra en la configuración de app en formato json el cual la tenemos que especificar.

    Abrimos el archivo appsettings.json y añadimos la siguiente linea

      "ConnectionStrings": {
        "DefaultConnection": "Server=.\\SQLEXPRESS;Database=ApiSepomex;User Id=sa;Password=xxxx; Integrated Security=True;"
      },
    

    Ejecutando los comandos finales en consola

    En esa última etapa ejecutaremos los comandos para finalmente crear nuestra entidad y comenzar a usarlos

    Instala el siguiente paquete para poder ejecutar los comandos:

    Install-Package Microsoft.EntityFrameworkCore.Tools
    

    Ahora ejecutamos el primer comando el cual creará la migración inicial y servirá para crear todos los modelos y configuraciones que hemos especificado

    Add-Migration InitialCreate
    

    Hasta este punto, aún no se crean las tablas en nuestra base de datos, para eso tendremos que actualizarla con el comando siguiente:

    Update-Database
    

    Y bueno, hasta este punto ya tenemos la primer parte para nuestra web api, en la siguiente parte haremos la inserción masiva de datos y también haremos las primeras consultas web api mediante nuestro controlador Postman.