DÊVIDA COM CLASSE (PRINCIPIANTE)

PERCIFILHO 12/01/2017 10:02:00
#470631
Bom dia amigos!
Tenho as minhas tabelas:

Cliente Contato
-------------- -------------------------
Id Nome Id Telefone ClienteId
-------------- -------------------------
1 Sebastião 1 1111-8888 1
2 Henrique 2 3202-8585 2
3 Matheus 3 8888-9999 3

Diante disso, tenho minhas classes:

class Cliente
{
public int Id { get; set; }
public string Nome { get; set;}
}

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

Preencho minha Grid (usando EntityFramework):

dgvClientes.DataSource = db.Cliente.ToList();

Dessa forma, aparece na grid somente o Id e o Nome do Cliente.
Como faço para mostrar também o telefone dele?
JABA 12/01/2017 13:47:47
#470644
Resposta escolhida
Seria mais ou menos assim:

class Cliente
{
public int Id { get; set; }
public string Nome { get; set;}

[txt-color=#e80000] public Contato Contato { get; set; }[/txt-color]

}

var dados = from c in db.Cliente
select new { c.Nome, c.Contato.Descricao };

dgvClientes.DataSource = dados.ToList();

PERCIFILHO 12/01/2017 14:20:22
#470649
Jaba, meu amigo, como vai você?
Já havia feito dessa forma, mas continua não dando certo. Não sei onde estou errando.

Minha classe Cliente, ficou assim:

    [Table([Ô]Cliente[Ô])]
public class Cliente
{
[Key]
public int Id { get; set; }

[StringLength(20)]
public string Nome { get; set; }

public Contato Contato { get; set; }
}


e a classe Contato, assim:

    [Table([Ô]Contato[Ô])]
public class Contato
{
[Key]
public int Id { get; set; }

[StringLength(20)]
public string Telefone { get; set; }
}


Aí, para preencher DataGridView, assim:

    var dados = from c in db.Cliente
select new { c.Nome, c.Contato.Telefone};

dgvPessoas.DataSource = dados.ToList(); --->> ESSA LINHA FICA SUBLINHADA


A mensagem de erro que aparece é essa:
[txt-color=#e80000]An error occurred while executing the command definition:
The column name is not valid. [ Node name (if any) = Extent1,Column name = Contato_Id ]
[/txt-color]

Pode ser algum erro relacionado à estrutura da tabela? Segue as estruturas:

Cliente:
Nome - Tipo - Length - PemiteNull - PrimaryKey - Identity
ClienteId int 4 false true true
Nome varchar 20 false false false

Contato:
Nome - Tipo - Length - PemiteNull - PrimaryKey - Identity
ContatoId int 4 false true true
ClienteId int 4 false false false
Telefone varchar 20 false false false
JABA 12/01/2017 14:55:26
#470653
Opa, amigão, tudo indo bem.

Teste colocando a propriedade [Ô]Contato[Ô] como virtual, se mesmo assim não funcionar, faça assim:

[ForeignKey([Ô]ClienteId[Ô])]
public virtual Contato Contato { get; set; }
PERCIFILHO 12/01/2017 15:19:47
#470655
Modifiquei a classe:

    [Table([Ô]Cliente[Ô])]
public class Cliente
{
[Key]
public int ClienteId { get; set; }

[StringLength(20)]
public string Nome { get; set; }

[ForeignKey([Ô]ClienteId[Ô])]
public virtual Contato Contato { get; set; }
}


O erro desapareceu, porém não mostra nada, ou seja o DataSource fica null;
Se eu excluir a propriedade Contato da classe, os dados aparecem normalmente;
JABA 12/01/2017 15:34:05
#470656
Chegou a testar colocando a propriedade como virtual sem usar o metadados [ForeignKey([Ô]ClienteId[Ô])] ?

Em vez de [Ô]ClienteId[Ô], use o [Ô]ContatoId[Ô] e veja se assim vai:

         [ForeignKey([Ô][txt-color=#e80000]ContatoId[/txt-color][Ô])]
public virtual Contato Contato { get; set; }

PERCIFILHO 12/01/2017 15:44:36
#470657
Já tentei tudo isso, mas não consegui. Sem sucesso. Estou ficando louco.
Você analisou as estruturas das tabelas? Não tem nada errado? Com as chaves primárias?
JABA 12/01/2017 15:51:40
#470658
KERPLUNK 12/01/2017 23:44:24
#470666
Poderia usar o assistente Code First, ele faz tudo isso pra você.
PERCIFILHO 13/01/2017 12:04:11
#470676
Boa tarde amigos!
Desculpem a demora em responder, mas fiquei sem computador desde ontem à tarde por conta da chuva e dos raios.
Agradeço as respostas.
Kerplunk, eu já havia feito isso antes com o Code First, porém, mesmo assim não estava conseguindo, ocorria aquele erro que eu citei.
Jaba, eu alterei a classe Contato, na propriedade virtual Cliente, colocando o atribuito Required. Encontrei a solução no fórum StackOverflow:
Aí funcionou corretamente:

[Required]
public virtual Cliente Cliente { get; set; }
JABA 13/01/2017 23:56:35
#470694
Citação:

Jaba, eu alterei a classe Contato, na propriedade virtual Cliente, colocando o atribuito Required. Encontrei a solução no fórum StackOverflow:
Aí funcionou corretamente:



Acho que já sei o que aconteceu. Esse campo estava como obrigatório na sua tabela, e na classe estávamos colocando-o como opcional, daí o conflito. Acredito que se você tivesse recriado a tabela, ele iria funcionar com o que te passei.

Abraços.
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas