DÊVIDA COM CLASSE (PRINCIPIANTE)
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?
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?
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();
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:
e a classe Contato, assim:
AÃ, para preencher DataGridView, assim:
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
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
Opa, amigão, tudo indo bem.
Teste colocando a propriedade [Ô]Contato[Ô] como virtual, se mesmo assim não funcionar, faça assim:
Teste colocando a propriedade [Ô]Contato[Ô] como virtual, se mesmo assim não funcionar, faça assim:
[ForeignKey([Ô]ClienteId[Ô])]
public virtual Contato Contato { get; set; }
Modifiquei a classe:
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;
[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;
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:
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; }
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?
Você analisou as estruturas das tabelas? Não tem nada errado? Com as chaves primárias?
Só escolher uma das opções e correr para o abraço:
www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx
www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx
Poderia usar o assistente Code First, ele faz tudo isso pra você.
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:
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; }
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.
Tópico encerrado , respostas não são mais permitidas