Dados relacionados com Entity Framework 4

Pessoal este tutorial ensina a realizar um CRUD com tabelas relacionadas(Herança).

Tabelas que herdam de outras. Por exemplo: você vai excluir um produto, mas ele também deve excluir a sua categoria. Como fazer essa exclusão sem ter que excluir a categoria. Vou explicar neste post.

Não vou detalhar muito como criar um projeto, um modelo do Entity Framework e etc, apenas explicar o relacionamento entre as tabelas.

Primeiro você deve criar um novo projeto WebFormApplication.

Depois você acrescenta um novo web form chamado cadastro.

Nosso layout deve ficar assim:

Agora vamos criar nosso modelo de dados EDMX.

Adicione um novo modelo em branco do entity framework. Crie o modelo conforme abaixo, pode colocar qualquer nome para o modelo:

Apenas 2 tabelas, algo simples para poder entender. Um relacionamento 1:N significa que 1 cliente pode ter vários endereços ou muitos endereços.

Gere o script desse modelo. Depois abra o SQL Server Management Studio e execute esse script lá. Se não como fazer, procure meu tutorial Crud com entity framework fácil, ensina passo a passo.

Em seguida clique 2 vezes no botão salvar para criar o método.

Coloque o seguinte código abaixo:


using (BancoEntities ctx = new BancoEntities())
{
Cliente cliente = new Cliente();// Devemos instanciar a tabela cliente(entidade)
Endereco endereco = new Endereco();// Estanciar a tabela endereco Também.

//Até aqui já conhecemos o procedimento.
cliente.Nome = txtNome.Text;
cliente.Email = txtEmail.Text;

endereco.Endereco1 = txtEndereco.Text;
endereco.Bairro = txtBairro.Text;
endereco.Cidade = txtCidade.Text;

//Aqui é o importante
endereco.Cliente.Add(cliente); //Nessa Linha vemos que podemos acessar as propriedades de outra tabela por meio do nosso objeto criado.

//Aqui vai depender de como ta os relacionamento da sua tabela. Poderia ser assim: cliente.Endereco.Add(endereco);
//Perceba que ao fazer endereco.Cliente.Add(cliente), ele apenas te dar a opçõe de Adicionar outro objeto. Se você fizer cliente.Endereco. , vai mostrar as propriedades da tabela endereço.

ctx.Endereco.AddObject(endereco); //Aqui a mesma coisa. Poderia ser assim: ctx.Cliente.AddObject(cliente);
ctx.SaveChanges();
CarregaGrid();
}

Lembrando que tudo depende de como está seus relacionamentos para você manipular seus objetos -> 1:N, N:N N:1 e etc.

Rode o projeto para verificar se está tudo ok.

Eu criei um método para mostrar o novo cliente inserido no banco em tempo de execução.

Apenas isso:


public void CarregaGrid()
{
using (BancoEntities ctx = new BancoEntities())
{
GridDados.DataSource = ctx.Cliente;
GridDados.DataBind();
}
}

Más cadê os dados do endereço no grid ? Como fazer pra mostrar os dados das 2 tabelas no grid. Você poderia usar uma StoreProcedure.

Vou mostrar como fazer usando linq to Entities. Vamos ao código

No método CarregaGrid acrescente o seguinte código:


var dados = from d in ctx.Cliente
select new // Aqui usamos o operador new para selecionar dados</code></strong></pre>
{
d.Nome, d.Email, d.Endereco.Endereco1, //Nestas 3 últimas linhas observamos que acessamos as propriedades da tabela endereço por meio da cliente.
// Poderia ser s.Cliente.Endereco...
d.Endereco.Bairro,
d.Endereco.Cidade
};
GridDados.DataSource = dados;
GridDados.DataBind();

Rode o projeto e verifique:

13 thoughts on “Dados relacionados com Entity Framework 4”

  1. Humn…sim interessante, não cheguei nessa parte ainda, e …isso aí não é Herança.

    Veja como esta meu modelo. Circulei aonde esta minha duvida.
    http://img72.imageshack.us/img72/5193/modeloi.jpg

    Eu estou perguntando sobre esse relacionamento, aonde PessoaFisica e PessoaJuridica herdam as colunas de Cliente.
    Quero saber como posso cadastrar uma PessoaFisica ou PessoaJuridica.

    Você pode ver que eu consigo setar valores normalmente nas tabelas Cliente e PessoaFisica, porém na hora de salvar ele
    salva apenas o da tabela Cliente, provavelmente porque nao coloquei um um “ctx” adicionado/salvando, sei lá, na tabela PessoaFisica.
    http://img52.imageshack.us/img52/3880/42224390.jpg

    Eu tinha encontrado alguem falando sobre um tal de isTypeOf, mas saquei o que estavam falando.

  2. Olhei o site que você colocou. Como podemos observar, muito simples e fácil.
    Corrigi o poste.

    Abraços!!

  3. Ivan, acredito que seja por que o Cliente que possui um endereço e não o Endereço possui o Cliente. Então vc acessa o Cliente.Endereço e Add um novo endereço (objeto). Caso vc queira mesmo que o Endereço possua o Cliente terá que alterar seu modelo.

  4. Ivan depende do como está o seu modelo do banco de dados.
    Mas isso não afeta em nada.
    Olha a resposta do David. Ele explicou mai detalhado.

    Abraços!

  5. Deu o seguinte erro, quando vai adicionar o dados no GridView:

    DataBinding: ‘f__AnonymousType0`4[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]’ não contém uma propriedade com o nome ‘Id’.

  6. Descobri o erro, no meu caso tinha que passar o id do cliente ou o id do endereço.

    Passando um deles deu certo.

  7. Boa noite,

    Parabens pelo tutorial muito bom, mas minha duvida é :
    1: como faço para atualizar e excluir esses dados de uma só vez?

    Coloquei todos os dados no grid conforme seu tutorial porém na hora que vou coloca-los de volta no textbox a tabela pessoa ta certinho, mas endereco da erro…

    Desde já agradeço…

  8. Olá Paulo.
    Estou desenvolvendo um programa para cadastro de médicos, onde no meu banco, possuo uma tabela Medico, possuindo as informações do médico (CRM, Nome, Endereço, Telefone, etc), e uma tabela Especialidade, que possui um Id e o Nome da especialidade. A tabela Especialidade já possui dados inseridos, e existe um relacionamento N:N entre as tabelas. Para isso, criei uma tabela intermediária que possui a chave primária de ambas as tabelas. Ao cadastrar um novo médico no sistema, é exibida a lista de especialidades disponíveis, e com isso várias especialidades são selecionadas. Não estou conseguindo inserir o novo médico ao banco relacionando este com a especialidade selecionada pelo usuário. Me é apresentada a mensagem de erro de que não é possível inserir uma chave primária duplicada. Tentei utilizar da mesma forma que você utilizou neste trecho de código: //Aqui é o importante
    15 endereco.Cliente.Add(cliente);

    Abraços.

Os comentários estão fechados.