Array
(
)

Datagridview Entity Framework

Victor Seraphin
   - 22 abr 2015

Boa noite a todos;
Estou começando a estudar sobre o EF. Estou criando um sistema básico para cadastro de produtos com categorias. Consigo cadastrar normalmente as categorias e lista-las. O problema esta na hora de listar os produtos. Ao invés de ao invés de ser exibido o conteudo da minha foreign key, esta aparecendo o nome do projeto.nome da classe da categoria:
Clique na imagem para abrir em uma nova janela
#Código

    public class Categoria
    {
        public int Id { get; set; }
        public string Descricao { get; set; }

        public virtual IEnumerable<Produto> Produtos { get; set; }
    }


    public class Produto
    {
        public int ID { get; set; }
        public string Nome { get; set; }
        public Categoria  Categoria { get; set; }

        public virtual ICollection<ListaDeProduto> ListaDeProdutos { get; set; }
    }


//Metodo Listar Categoria

        public IEnumerable<Produto> Listar()
        {
            var grade = (from g in banco.Produtos
                select g ).ToList();
            return grade;
        }


Código form1
#Código
 public void CarregarGrid()
        {
            dgvProduto.DataSource = null;
            dgvProduto.DataSource = appProduto.Listar();



            cbbCategoria.DataSource = appCategoria.Listar();
            cbbCategoria.ValueMember = "Id";
            cbbCategoria.DisplayMember = "Descricao";
        }

  private void btnCadastrar_Click(object sender, EventArgs e)
        {
            int categoriaID = Convert.ToInt32(cbbCategoria.SelectedValue);

            Produto objProduto = new Produto
            {
                Nome = txtProduto.Text,
                Categoria = appCategoria.Listar().First(x=> x.Id == categoriaID )
            };
            appProduto.Salvar(objProduto);
            CarregarGrid();
        }


Sou iniciante em C# e Entity Framework.

Alisson
|
MVP
Pontos: 3400
    24 abr 2015

Victor bom dia.

Poderia verificar como está gravado no banco de dados essa informação?
Pois não vi nada de anormal no seu código.

Se puder mandar esse exemplo para testar aqui e conseguir te auxiliar seria bom.

Elessandro Poças
   - 30 abr 2015

Victor,

Se você estiver usando CODE First a sua classe produto deveria ser da seguinte forma:

#Código

public class Produto
    {
        public int ID { get; set; }
        public string Nome { get; set; }
        public int Categoria_Id { get; set; }
        public Categoria  Categoria { get; set; }
 
        public virtual ICollection<ListaDeProduto> ListaDeProdutos { get; set; }
    }



Você vai precisar alterar a forma de como você está fazendo a sua consulta, pesquise sobre tipos anônimos usando Linq to Entity.
Um simples exemplo:
#Código
Public IEnumerable<Produto> ConsultaProdutos()
{
         using (seu_contexto ctx = new seu_contexto)
         {
                var consulta = from p in ctx.Produtos.ToList()
                                       select new
                                       {
                                            p.Produto_Id,
                                            p.Descricao,
                                            p.Categoria_Id
                                        };
                 return consulta.ToList();
         }
}



Outra dica: Evite usar chave primarias nomeadas somente como ID, procure ser mas específico no seu caso Produto_ID, pois já tive alguns problemas com este tipo de nomenclatura.

Acesse esse link, lá você vai conseguir sanar muitas dúvidas: http://www.entityframeworktutorial.net/