Visita nuestros cursos en KODOTI. Click para unirte
Estudia con KODOTI. Únete

NETCore Api + VueJs SPA: configurando nuestra Api con Entity Framework

Vamos a crear los servicios para implementar nuestros métodos de CRUD con NETCore y Web Api.

Rodríguez Patiño, Eduardo
4,496 lecturas
Rodríguez Patiño, Eduardo
Hemos migrado nuestras publicaciones del blog antiguo. Si crees que esta se encuentra incompleta o sin coherencia deja un comentario para darle una pronta solución.

En esta primera parte vamos a crear un proyecto ASP.NET Core Web y crear una plantilla de Web Api sin autenticación. Luego de esto lo vamos a separar el proyhecto por capas agregando class libraries.

Model

Representa nuestro modelos de la capa de dominio, es decir las tablas mapeadas a clases.

{
    public class Student
    {
        public int StudentId { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }
        public string Bio { get; set; }
    }
}

Persistence

Nuestra clase que será encargada de manejar las migraciones y la conexión a la base de datos. Para hacer funcionar esta parte debemos agregar los siguientes package del NuGet y luego crear nuestro DbContext.

  • EntityFrameworkCore.SqlServer
  • EntityFrameworkCore.Tools
public class StudentDbContext : DbContext
{
    public DbSet Student { get; set; }

    public StudentDbContext(DbContextOptions options)
    : base(options)
    { }
}

No olvidemos registrar dicha dependencia en nuestro StartUp para que este disponible para todo el proyecto.

public void ConfigureServices(IServiceCollection services)
{
    var connection = Configuration.GetConnectionString("Dev");
    services.AddDbContext(options => options.UseSqlServer(connection));

    services.AddTransient();

    services.AddMvc();
}

API

Nuestra capa REST que implementa los recursos a exponer como API.

namespace api.Controllers
{
    [Route("[controller]")]
    public class StudentController : Controller
    {
        private readonly IStudentService _studentService;

        public StudentController(IStudentService studentService)
        {
            _studentService = studentService;
        }

        // GET api/values
        [HttpGet]
        public IActionResult Get()
        {
            return Ok(
                _studentService.GetAll()
            );
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public IActionResult Get(int id)
        {
            return Ok(
                _studentService.Get(id)
            );
        }

        // POST api/values
        [HttpPost]
        public IActionResult Post([FromBody] Student model)
        {
            return Ok(
                _studentService.Add(model)
            );
        }

        // PUT api/values/5
        [HttpPut]
        public IActionResult Put([FromBody] Student model)
        {
            return Ok(
                _studentService.Add(model)
            );
        }

        // DELETE api/values/5
        [HttpDelete("{id}")]
        public IActionResult Delete(int id)
        {
            return Ok(
                _studentService.Delete(id)
            );
        }
    }
}

Con respecto a las rutas no hemos escrito ni unas reglas, así que estamos usando el ruteo REST. En un proyecto real prefiero modificar la escritura desde el StartUp tal como lo genera un proyecto MVC.

app.UseMvc(routes =>
{
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
});

Services

Nuestros servicios que vamos a declarar que se encargarán de realizar las consultas a la base de datos.

namespace Service
{
    public interface IStudentService
    {
        IEnumerable<Student> GetAll();
        bool Add(Student model);
        bool Delete(int id);
        bool Update(Student model);
        Student Get(int id);
    }

    public class StudentService : IStudentService
    {
        private readonly StudentDbContext _studentDbContext;

        public StudentService(
            StudentDbContext studentDbContext
        )
        {
            _studentDbContext = studentDbContext;
        }

        public IEnumerable<Student> GetAll()
        {
            var result = new List<Student>();

            try
            {
                result = _studentDbContext.Student.ToList();
            }
            catch (System.Exception)
            {

            }

            return result;
        }

        public Student Get(int id)
        {
            var result = new Student();

            try
            {
                result = _studentDbContext.Student.Single(x => x.StudentId == id);
            }
            catch (System.Exception)
            {

            }

            return result;
        }

        public bool Add(Student model)
        {
            try
            {
                _studentDbContext.Add(model);
                _studentDbContext.SaveChanges();
            }
            catch (System.Exception)
            {
                return false;
            }

            return true;
        }

        public bool Update(Student model)
        {
            try
            {
                var originalModel = _studentDbContext.Student.Single(x =>
                    x.StudentId == model.StudentId
                );

                originalModel.Name = model.Name;
                originalModel.LastName = model.LastName;
                originalModel.Bio = model.Bio;

                _studentDbContext.Update(originalModel);
                _studentDbContext.SaveChanges();
            }
            catch (System.Exception)
            {
                return false;
            }

            return true;
        }

        public bool Delete(int id)
        {
            try
            {
                _studentDbContext.Entry(new Student { StudentId = id }).State = EntityState.Deleted; ;
                _studentDbContext.SaveChanges();
            }
            catch (System.Exception)
            {
                return false;
            }

            return true;
        }
    }
}
¿Te gustó nuestra publicación?
Suscríbete a nuestro boletín