Como cargar datos a una tabla ASP.NET MVC de tablas relacionadas

publicado por: Anonymous

Tengo una tabla HTML en ASP.NET MVC que muestra los datos del Modelo MyModel en una tabla HTML.
Ahora lo que necesito es que de las columnas Codigo_User y Codigo_Campo (las cuales guardan códigos) me muestre la descripción de esos códigos, los cuales están en otras tablas MyTablaCampos y MyTablaUsers
Aqui dejo la definicion de mis modelos:
MyModel

_x000D_

_x000D_

        public partial class MyModel_x000D_
        {_x000D_
            public int Id { get; set; }_x000D_
            public string Codigo_User { get; set; }_x000D_
            [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]_x000D_
            public Nullable<System.DateTime> Fecha_solicitud { get; set; }_x000D_
            public Nullable<int> Codigo_Campo { get; set; }_x000D_
            public string Ubicacion { get; set; }       _x000D_
            public MyTablaCampos Campos { get; set; }_x000D_
            public MyTablaUsers Users { get; set; }_x000D_
        }_x000D_
_x000D_
    namespace MyProyect.Models_x000D_
    {_x000D_
        using System;_x000D_
        using System.Collections.Generic;_x000D_
        _x000D_
        public partial class MyTablaUsers _x000D_
        {_x000D_
            public string Codigo_User { get; set; }_x000D_
            public string Nombre { get; set; }_x000D_
            public string Contacto { get; set; }_x000D_
            public string RFC { get; set; }_x000D_
        }_x000D_
    }      _x000D_
_x000D_
    namespace MyProyect.Models_x000D_
    {_x000D_
        using System;_x000D_
        using System.Collections.Generic;_x000D_
        _x000D_
        public partial class MyTablaCampos _x000D_
        {_x000D_
            public short Cod_Empresa { get; set; }_x000D_
            public string Codigo_User { get; set; }_x000D_
            public short Codigo_Campo { get; set; }_x000D_
            public string Descripcion { get; set; }_x000D_
            public short Tipo { get; set; }_x000D_
            public short Producto { get; set; }_x000D_
          }_x000D_
    }

_x000D_

_x000D_

_x000D_

Esta es la estructura de mi tabla HTML, en las columnas donde quiero que aparezcan los nombre no sale nada, así que nose si haya otra solución.
Gracias.

_x000D_

_x000D_

@model IEnumerable<Inocuidad.Models.MyModel>_x000D_
_x000D_
<div class="col-sm-12 table-responsive table-condensed table-sm" style="font-size:small">_x000D_
<table class="table table-hover" id="dataTableCreditos">_x000D_
  @if (Model != null)_x000D_
  {_x000D_
  <thead class="thead-light">_x000D_
  <tr>_x000D_
  <th>Codigo_User</th>_x000D_
  <th>Usuario</th>_x000D_
  <th>Codigo_Campo</th>_x000D_
  <th>Campo</th>_x000D_
  <th>Fecha de solicitud</th>_x000D_
  <th>Ubicacion</th>_x000D_
  </tr>_x000D_
  </thead>_x000D_
  <tbody>_x000D_
  @foreach (var item in Model)_x000D_
  {_x000D_
  <tr>_x000D_
  <td>_x000D_
  @Html.DisplayFor(modelItem => item.Codigo_User, new { id = "Codigo_User" })_x000D_
  </td>_x000D_
  <td>_x000D_
  @Html.DisplayFor(modelItem => item.Users.Nombre)_x000D_
  </td>_x000D_
  <td>_x000D_
  @Html.DisplayFor(modelItem => item.Codigo_Campo, new { id = "Codigo_Campo" })_x000D_
  </td>_x000D_
  <td>_x000D_
  @Html.DisplayFor(modelItem => item.Campos.Descripcion)_x000D_
  </td>_x000D_
  <td>_x000D_
  @Html.ValueFor(modelItem => item.Fecha_solicitud)_x000D_
  </td>_x000D_
  <td>_x000D_
  @Html.DisplayFor(modelItem => item.Ubicacion)_x000D_
  </td>_x000D_
 </tr>_x000D_
}_x000D_
</tbody>_x000D_
}_x000D_
</table>_x000D_
</div>

_x000D_

_x000D_

_x000D_

_x000D_

_x000D_

public ActionResult SetSolicitud()_x000D_
{_x000D_
 var item = from s in bd.MyModel select s;_x000D_
 return View(item.ToList());_x000D_
}

_x000D_

_x000D_

_x000D_

Resultado esperado

introducir la descripción de la imagen aquí

solución

En tu controlador:

public ActionResult SetSolicitud()
{
 var item = from s in bd.MyModel select s;
 return View(item.ToList());
}

Lo reemplazaré por una expresión lambda:

public ActionResult SetSolicitud()
{
 var model = bd.MyModel.Include(x => x.Users).Include(y => y.Campos).ToList();
 return View(model);
}

Según la documentación oficial :

Cargando diligentemente (eagerly loading)

La carga diligente es el proceso por el cual una consulta para un tipo de entidad también carga las entidades relacionadas como parte de la consulta. La carga diligente se logra mediante el uso del método include. Por ejemplo, las consultas siguientes cargarán blogs y todas las entradas relacionadas con cada blog.

Nota de la documentación:

Include es un método de extensión en el espacio de nombres System. Data. Entity, por lo que debe asegurarse de que está usando ese espacio de nombres.

Comentario:

Ahora bien, en teoría ya tienes la propiedad cargada y debería estar disponible para ser presentada por la vista.

Actualización:

public partial class MyModel
    {
        public int Id { get; set; }
        public string Codigo_User { get; set; }
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public Nullable<System.DateTime> Fecha_solicitud { get; set; }
        public Nullable<int> Codigo_Campo { get; set; }
        public string Ubicacion { get; set; }       
        //Aqui la navegación entre clases:
        public virtual MyTablaCampos Campos { get; set; } 
        public virtual MyTablaUsers Users { get; set; }
    }

En la clase con la que se relaciona:

 public partial class MyTablaUsers 
        {
            public string Codigo_User { get; set; }
            public string Nombre { get; set; }
            public string Contacto { get; set; }
            public string RFC { get; set; }
            //Con esto Entity Framework entiende la relación:
            public virtual MyModel mymodel { get; set; }
        }

Ahora con respectoa los campos:

 public partial class MyTablaCampos 
    {
        public short Cod_Empresa { get; set; }
        public string Codigo_User { get; set; }
        public short Codigo_Campo { get; set; }
        public string Descripcion { get; set; }
        public short Tipo { get; set; }
        public short Producto { get; set; }
        //Con esto Entity Framework entiende la relación:
        public virtual MyModel mymodel { get; set; }
      }

Para mejorar el entendimiento y dominio de Entity Framework, este sitio es altamente recomendado: https://www.entityframeworktutorial.net/

Respondido por: Anonymous

Leave a Reply

Your email address will not be published.