none
Problema al crear <List> Asp.net MVC RRS feed

  • Pregunta

  • Buen dia,

    tengo dos clases en mi carpeta Models que corresponden a dos tablas en mi base de datos, la primera de de usuario y la segunda de perfiles, están establecidas de la siguiente manera:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Web;
    
    
    namespace LoginWindowsForm.Models
    {
        public class Usrio
        {
            [Required(ErrorMessage = "Usuario es requerido")]
            [DisplayName("Usuario")]
            public virtual string idUsrio { get; set; }
    
            public virtual string nmbreUsrio { get; set; }
    
            public virtual Prfil prfil { get; set; }
    
            public virtual bool actvo { get; set; }
    
            public virtual string dmnio { get; set; }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace LoginWindowsForm.Models
    {
        public class Prfil
        {
            public virtual int idPrfil { get; set; }
    
            public virtual string nmbrePrfil { get; set; }
    
            public virtual bool actvo { get; set; }
        }
    }

    Ambas tablas estan relacionadas por el perfil.

    ahora intento listar la informacion de una consulta y lo hago asi:

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    
    namespace LoginWindowsForm.Models
    {
        public class BusinessLayer
        {
    
            public IEnumerable<Usrio> RetornaUsuario
            {
                get{
                    string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
    
                    string queryString = "SELECT idUsrio, nmbreUsrio, idPrfil, actvo, dmnio FROM dbo.CtlgoUsrios";
    
                    
    
                    List<Usrio> usuario = new List<Usrio>();
    
                    using (SqlConnection con = new SqlConnection(connectionString))
                    {
                        con.Open();
    
                        SqlCommand cmd = new SqlCommand(queryString, con);
                        SqlDataReader rdr = cmd.ExecuteReader();
    
                        while (rdr.Read())
                        {
                            Usrio user = new Usrio();
    
                            user.idUsrio = rdr["idUsrio"].ToString();
                            user.nmbreUsrio = rdr["nmbreUsrio"].ToString();
                            user.prfil.idPrfil = Convert.ToInt32(rdr["idPrfil"]);
                            user.actvo = Convert.ToBoolean(rdr["actvo"]);
                            user.dmnio = rdr["dmnio"].ToString();
    
                            usuario.Add(user);
                        }
                    }
    
                    return usuario;
                }
            }
        }
    }

    sin embargo todo va bien hasta:

    user.prfil.idPrfil = Convert.ToInt32(rdr["idPrfil"]);

    en este momento falla supongo yo que algo no estoy haciendo bien con la relación entre las clases de estas tablas.

    Agradezco la colaboración.

    jueves, 1 de septiembre de 2016 17:38

Respuestas

  • Hola Jeff M Quintero,

    Te recomendaría no trabajar directamente con las clases del Modelo, sino crear clases ViewModel exclusivas para las vistas, y puedes usar AutoMapper para mapear entre clases.

    Además según tus clases, necesitas agregar un elemento de tipo Prfil al objeto Usrio que estás creando.

         public class Usrio
         {
              .....
              public virtual Prfil prfil { get; set; }
              ....
          }

    Tendrías que tener algo como esto :

                          Usrio user = new Usrio()
                            {
                                idUsrio = rdr["idUsrio"].ToString(),
                                nmbreUsrio = rdr["nmbreUsrio"].ToString(),
                                prfil = new Prfil()
                                {
                                    idPrfil = Convert.ToInt32(rdr["idPrfil"]),
                                    nmbrePrfil = "nmbrePrfil",  //Estos campos tienes que obtener
                                    actvo = true  //Este
                                },
                                actvo = Convert.ToBoolean(rdr["actvo"]),
                                dmnio = rdr["dmnio"].ToString()
                            };

    Ten en cuenta que esos campos tienen que venir en tu consulta, puedes usar el Inner Join.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Jeff M Quintero lunes, 5 de septiembre de 2016 15:38
    jueves, 1 de septiembre de 2016 17:56

Todas las respuestas

  • Hola Jeff M Quintero,

    Te recomendaría no trabajar directamente con las clases del Modelo, sino crear clases ViewModel exclusivas para las vistas, y puedes usar AutoMapper para mapear entre clases.

    Además según tus clases, necesitas agregar un elemento de tipo Prfil al objeto Usrio que estás creando.

         public class Usrio
         {
              .....
              public virtual Prfil prfil { get; set; }
              ....
          }

    Tendrías que tener algo como esto :

                          Usrio user = new Usrio()
                            {
                                idUsrio = rdr["idUsrio"].ToString(),
                                nmbreUsrio = rdr["nmbreUsrio"].ToString(),
                                prfil = new Prfil()
                                {
                                    idPrfil = Convert.ToInt32(rdr["idPrfil"]),
                                    nmbrePrfil = "nmbrePrfil",  //Estos campos tienes que obtener
                                    actvo = true  //Este
                                },
                                actvo = Convert.ToBoolean(rdr["actvo"]),
                                dmnio = rdr["dmnio"].ToString()
                            };

    Ten en cuenta que esos campos tienen que venir en tu consulta, puedes usar el Inner Join.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta Jeff M Quintero lunes, 5 de septiembre de 2016 15:38
    jueves, 1 de septiembre de 2016 17:56
  • hola

    puedes definir lo mencionado por Joel o puedes instanciar la propiedad en el constructor

    public class Usrio
    {
    	public Usrio()
    	{
    		this.prfil = new Prfil();
    	}
    	
    	[Required(ErrorMessage = "Usuario es requerido")]
    	[DisplayName("Usuario")]
    	public virtual string idUsrio { get; set; }
    
    	public virtual string nmbreUsrio { get; set; }
    
    	public virtual Prfil prfil { get; set; }
    
    	public virtual bool actvo { get; set; }
    
    	public virtual string dmnio { get; set; }
    }

    de esta forma tendras la instancia y por lo tanto podrias asignar la propiedad del Prfil como lo haces en tu codigo actual


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 2 de septiembre de 2016 2:30