Estamos trabajando en algo propio llamado KODOTI. Click para unirte
Se viene KODOTI. Únete

ASP.NET MVC: obteniendo un registro y sus relaciones

En esta segunda parte, vamos a obtener un registro y la relación que tiene asignada.

Rodríguez Patiño, Eduardo
37,883 lecturas
Rodríguez Patiño, Eduardo
Hemos migrado hace poco nuestras publicaciones del blog antiguo. Si crees que esta se encuentra incompleta o sin coherencia deja un comentario para restaurarla manualmente.

Seguimos con nuestro proyecto, ahora lo que nos toca ver es el método Obtener, el cual nos va a retornar un registro de nuestra base de datos y a su vez, tenemos que traer sus relaciones.

Clase Alumno

Veamos como se encuentra nuestra clase Alumno, la cual ha tenido una serie de cambios.

[Table("Alumno")]
public partial class Alumno
{
    public Alumno()
    {
        Cursos = new List<Curso>();
    }

    public int id { get; set; }

    [Required]
    [StringLength(50)]
    public string Nombre { get; set; }

    [Required]
    [StringLength(100)]
    public string Apellido { get; set; }

    public ICollection<Curso> Cursos { get; set; }

    public List<Alumno> Listar() 
    {
        var alumnos = new List<Alumno>();
        try
        {
            using (var context = new TestContext()) 
            {
                alumnos = context.Alumno.ToList();
            }
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }

        return alumnos;
    }

    public Alumno Obtener(int id) 
    {
        var alumno = new Alumno();
        try
        {
            using (var context = new TestContext())
            {
                alumno = context.Alumno
                                .Include("Cursos")
                                .Where(x => x.id == id)
                                .Single();
            }
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }

        return alumno;
    }
}

Propiedad "Cursos"

¿Cual es lo nuevo?, hemos creado la propiedad Cursos, la cual se encargará de almacenar a todos los Cursos que tiene elegido dicho alumno.

public ICollection<Curso> Cursos { get; set; }

Como buena práctica, hemos creado un constructor e inicializamos esta propiedad para que por defecto tengo un valor.

public Alumno()
{
    Cursos = new List<Curso>();
}

Método "Obtener()"

Como yo soy de la idea de encapsular nuestra lógica, he creado el método obtener encargado obtener un registro de nuestra base de datos, como parámetro de entrada espera que se le pase el ID de la fila a consultar.

public Alumno Obtener(int id) 
{
    var alumno = new Alumno();
    try
    {
        using (var context = new TestContext())
        {
            alumno = context.Alumno
                            .Include("Cursos")
                            .Where(x => x.id == id)
                            .Single();
        }
    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }

    return alumno;
}

Vemos que se está llamando a un método Include y le pasamos el valor de la propiedad que queremos llenar, en nuestro caso la propiedad Cursos, luego este se encargará de hacer la consulta la base de datos para traer los cursos que tiene el alumno.

¿Como sabe el include que tablas debe consultar para manejar la relación?

Vamos a nuestra clase TextContext y al método OnModelCreating.

modelBuilder.Entity<Alumno>()
    .HasMany(e => e.Cursos)
    .WithMany(e => e.Alumno)
    .Map(m => m.ToTable("AlumnoCurso"));

Este es el encargado de decirle que tabla es la que relaciona al Alumno y a los Cursos, por defecto el Entity Framework sabe que los campos deben contener el siguiente prefijio _id. Por lo tanto, buscará los campos de esta manera ("TABLA" + "PREFIJO"), osea "Alumno_id" y "Curso_id".}

Image title

NOTA:el entity framework por defecto permite navegar entre las propiedades y realizar las consultas a la base de datos porque tiene activado el LazyLoad, del caso contrario deberíamos hacer un query al Contexto actual.

Mostrando el alumno obtenido

Para ello vamos a crear una nueva acción, que se llamará Ver, el cual espera que se la pase el ID del registro a traer.

public ActionResult Ver(int id)
{
    return View(alumno.Obtener(id));
}

Seguidamente creamos su vista:

@model Model.Alumno
@{
    ViewBag.Title = Model.Nombre + " " + Model.Apellido;
}

<ol class="breadcrumb">
  <li><a href="~/">Alumnos</a></li>
  <li class="active">@(Model.Nombre + " " + Model.Apellido)</li>
</ol>

<div class="panel panel-default">
  <div class="panel-heading">Información personal</div>
  <div class="panel-body">
    <dl class="dl-horizontal">
      <dt>Nombre</dt>
      <dd>@Model.Nombre</dd>
      <dt>Apellido</dt>
      <dd>@Model.Apellido</dd>
    </dl>
  </div>
</div>

<div class="panel panel-default">
  <div class="panel-heading">Asignaturas seleccionadas</div>
  <div class="panel-body">
    <ul class="list-group">
    @foreach (var c in Model.Cursos) 
    {
        <li class="list-group-item">
            @c.Nombre
        </li>
    }
    </ul>
  </div>
</div>

De esta forma es como podemos obtener un registro de la base de datos y su relación, recomiendo que vean el VIDEO ya que ahí hacemos todo lo de este post paso a paso y más. Además, vamos a ir viendo la maquetación de nuestro proyecto usando Bootstrap 3.

Partes

¿Te gustó nuestra publicación?
Suscríbete a nuestro boletín