En la siguiente entrada veremos como crear una plantilla CRUD (Create, Replace, Update & Delete), así como la creación y ejemplo de una base de datos sobre la que haremos pruebas, los modales, repositorios y controladores necesarios para la correcta implementación.

1

Para empezar, crearemos una tabla en la base de datos a la que llamaremos Vuelos. Utilizaremos esta tabla, la cual cuenta con Id, Flynumber, Airlane, Cityfrom, Cityto, Gate y Hour. Nos servirá como entorno de pruebas para las funciones que crearemos más adelante.

2

A continuación, en el entorno «Visual Studio 2019», crearemos un nuevo proyecto con la plantilla «Aplicacion Web ASP.NET Core»

3

Tras ponerle un nombre, elegiremos la opción de la plantilla de proyecto controlador de vista de modelos (MVC), el cual nos facilitará el comienzo del proyecto ya que nos crea automáticamente el Startup, con sus carpetas etc.

4

Antes de empezar con el código, implementaremos el servidor con el que vamos a trabajar. En este caso estamos utilizando Microsoft SQL Server Management Studio 18.

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*",
    "ConnectionStrings": {
        "cadenasql": "Data Source=localhost;Initial Catalog=TAJAMAR1;User ID=sa;Password=******"
    }
}

Tras conectar con nuestro servidor, en el appsettings.json escribimos la siguiente cadena de conexion, donde los asteriscos son nuestra debida contraseña si existe.

IConfiguration Configuration;
        public Startup(IConfiguration configuration)
        {
            this.Configuration = configuration;
        }



        public void ConfigureServices(IServiceCollection services)
        {
            String cadenasql = this.Configuration.GetConnectionString("cadenasql");
            services.AddDbContext<LlegadasContext>(options => options.UseSqlServer(cadenasql));
            services.AddControllersWithViews();
        }

El startup quedaría algo así, creamos un constructor en el que inicialicemos y declaremos el IConfiguration. Dentro de los servicios creamos la cadena para recuperar la anteriormente escrita en el appsettings.json

[Table("VUELOS")]
    public class Llegada
    {
        [Key]
        [Column("ID")]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }
        [Column("FLYNUMBER")]
        public String Fly{ get; set; }
        [Column("AIRLANE")]
        public String Airlane { get; set; }
        [Column("CITYFROM")]
        public String From { get; set; }
        [Column("CITYTO")]
        public String To { get; set; }
        [Column("GATE")]
        public int Gate{ get; set; }
        [Column("HOUR")]
        public String Hour{ get; set; }
    }

A continuación creamos el modelo dentro de la carpeta Models>Llegada con todas las propiedades que se puedan obtener de la base de datos.

public class LlegadasContext : DbContext
{
        public LlegadasContext(DbContextOptions<LlegadasContext> options) : base(options) { }
        public DbSet<Llegada> Llegadas{ get; set; }
}

Dentro de la carpeta Data>LlegadasContext creamos este fichero, el que unicamente tiene la llamada al DbSet de tipo Llegada, que es el modal que hemos creado con anterioridad y con el que manejaremos toda nuestra aplicación.

public interface IRepositoryLlegadas
    {
        List<Llegada> GetLlegadas();

        Llegada BuscarLlegada(int id);

        void EliminarLlegada(int id);


        void InsertarLlegada(int id, string fly, string airlane, string from, string to, int gate, string hour);


        void ModificarLlegada(int id, string fly, string airlane, string from, string to, int gate, string hour);
    }

Para facilitarnos la implementación de métodos cuando tenemos varios repositorios, crearemos una interfaz a la que llamaremos IRepositoryLlegadas en la que instanciaremos todos aquellos métodos que queramos utilizar en nuestra app.

public class RepositoryLlegadas : IRepositoryLlegadas
    {
        LlegadasContext context;

        public RepositoryLlegadas(LlegadasContext context)
        {
            this.context = context;
        }
        public Llegada BuscarLlegada(int idLlegada)
        {
            return this.context.Llegadas.Where(z => z.Id == idLlegada).FirstOrDefault();
        }

        public void EliminarLlegada(int idLlegada)
        {
            Llegada Llegada = this.BuscarLlegada(idLlegada);
            this.context.Llegadas.Remove(Llegada);
            this.context.SaveChanges();
        }

        public List<Llegada> GetLlegadas()
        {
            var consulta = from datos in context.Llegadas
                           select datos;
            return consulta.ToList();
        }

        public void InsertarLlegada(int id, string fly, string airlane, string from, string to, int gate, string hour)
        {
            Llegada llegada = new Llegada();
            llegada.Id = id;
            llegada.Fly = fly;
            llegada.Airlane = airlane;
            llegada.From = from;
            llegada.To = to;
            llegada.Gate = gate;
            llegada.Hour =  hour;
            this.context.Llegadas.Add(llegada);
            this.context.SaveChanges();
        }

    

        public void ModificarLlegada(int id, string fly, string airlane, string from, string to, int gate, string hour)
        {
            Llegada llegada = new Llegada();
            llegada.Id = id;
            llegada.Fly = fly;
            llegada.Airlane = airlane;
            llegada.From = from;
            llegada.To = to;
            llegada.Gate = gate;
            llegada.Hour = hour;
            this.context.Llegadas.Update(llegada);
            this.context.SaveChanges();
        }
    }

Todos estos metodos tenemos que implementarlos en nuestro repositorio RepositoryLlegadas en el que desarrollaremos todos estos metodos y extenderemos del IRepository anterior. Ambos los guardaremos dentro de >Repositories. Tras ello tenemos que ir al Startup y añadir esta linea:

services.AddTransient<IRepositoryLlegadas , RepositoryLlegadas>();

 public class LlegadasController : Controller
    {

        IRepositoryLlegadas repo;

        public LlegadasController(IRepositoryLlegadas repo) { 
            this.repo = repo; 
        }

        public IActionResult Index()
        {
            List<Llegada> Llegadas = this.repo.GetLlegadas();
            return View(Llegadas);
        }

        public IActionResult Details(int id)
        {
            Llegada Llegada = this.repo.BuscarLlegada(id);
            return View(Llegada);
        }
        
        public IActionResult Delete(int id)
        {
            this.repo.EliminarLlegada(id);
            return RedirectToAction("Index");
        }

        public IActionResult Create()
        {
            return View();
        }
        [HttpPost]
        public IActionResult Create(int Id, string Fly, string Airlane, string From, string To, int Gate, string Hour)
        {
            this.repo.InsertarLlegada(Id, Fly, Airlane, From, To, Gate, Hour);
            return RedirectToAction("Index");
        }


        public IActionResult Edit(int id)
        {
            Llegada Llegada = this.repo.BuscarLlegada(id);
            return View(Llegada);
        }
        [HttpPost]
        public IActionResult Edit(int Id, string Fly, string Airlane, string From, string To, int Gate, string Hour)
        {
            this.repo.ModificarLlegada(Id, Fly, Airlane, From, To, Gate, Hour);
            return RedirectToAction("Index");
        }

Después, crearemos el controlador el cual administrará todas nuestras vistas, lo llamaremos > Controllers > LlegadasController

Empezaremos con el Index(). Para crear la tabla automáticamente, daremos click derecho sobre el nombre del metodo, y crearemos una vista generada con scaffolding. Para ello clicamos sobre vista de razor y despues en nombre de la Vista elegimos: List, y en Plantilla el modelo que hemos creado arriba llamado Llegadas.

5

Este es el documento que se crea dentro de Views > Llegadas > Index.cshtml. Este , al ejecutarlo y acceder a la ruta https://localhost:44344/Llegadas nos debería de salir la siguiente tabla que acabamos de crear:

6

A continuación, tenemos los siguientes 4 botones: Edit, Details, Delete y encima de la tabla, el Create. Cada uno de ellos hace referencia a un método del controller, de los cuales podemos crear las vistas de razor al igual que con la del Index (List).

Adjuntaré una captura del código generado por cada uno de los métodos:

Create:

11
12

Details:

9
10

Edit:

7
8

Delete:

El método delete no tiene una vista propia ya que el IActionResult:

public IActionResult Delete(int id)
{
this.repo.EliminarLlegada(id);
return RedirectToAction(«Index»);
}

Contiene un redirect al index, para simular que cuando borramos una fila de la tabla, se actualice automáticamente.

Esta sería una pequeña explicación de las funcionalidades básicas de un CRUD en ASP .NET CORE.

Autor/a: Rafael Ruiz

Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma

Centro: Tajamar

Año académico: 2020-2021

Github: https://github.com/RuizRafael/Post2_CreacionCrud

Gracias por la lectura. Rafa.

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.