C# - Implementando o relacionamento um-para-muitos


 Neste artigo eu vou mostrar como podemos implementar o relacionamento um-para-muitos em classes com esse tipo de associação usando a linguagem C#.


Imagine um cenário onde você esta iniciando no paradigma da orientação a objetos e tenha que definir as classes com uma associação um-para-muitos e também a sua implementação.

Você deverá definir as classes, os atributos, representar o relacionamento, gerar uma associação entre as classes e criar um projeto para mostrar a implementação das classes. Um típico exercício acadêmico que se repete aos milhares no dia a dia de um desenvolvedor que usa uma linguagem orientada a objetos.

Este é um assunto recorrente e já muito bem conhecido para quem tem uma boa experiência com programação orientada a objetos, mas o que pode parecer simples para quem têm experiência, para quem esta começando agora, pode ser um pesadelo.

Neste artigo eu vou mostrar como  definir e implementar as classes envolvidas em uma associação um-para-muitos, o mesmo existente entre duas tabelas de um banco de dados relacional. Vou mostrar também como gerar a associação entre as classes e criar um projeto para implementar a solução, enfim mostrar uma das possíveis maneiras de resolver este problema usando apenas como ferramenta a linguagem C#  que é uma linguagem orientada a objetos.

Recursos Usados

Conceitos Básicos - O relacionamento um-para-muitos

Nosso ponto de partida será um banco de dados relacional com duas tabelas onde existe um relacionamento um-para-muitos(assim fica mais fácil entender o exemplo das classes.)

O relacionamento um-para-muitos é o mais frequente e ocorre quando uma linha na Tabela A pode ter muitas linhas coincidentes na Tabela B, mas uma linha na Tabela B tem uma só linha coincidente na Tabela A.

Este relacionamento é representado por => 1:N

Neste tipo de relacionamento a chave primária da tabela que tem o lado 1 vai para a tabela do lado N. No lado N ela é chamada de chave estrangeira.

No banco de dados Northwind.mdf temos um exemplo desse relacionamento entre as tabelas Customers e Orders.

Cada cliente somente é cadastrado só uma vez na tabela Customers (por isso o campo CustomerID, na tabela Customer, é uma chave primária), portanto a tabela Customer será o lado um do relacionamento.

Ao mesmo tempo cada cliente pode fazer diversos pedidos, por isso que o mesmo Código de Cliente(CustomerID) poderá aparecer várias vezes na tabela Orders: tantas vezes quantos forem os pedidos que o Cliente tiver feito.

Por isso temos um relacionamento do tipo Um-para-Muitos entre a tabela Customers e Orders, através do campo CustomerID, indicando que um mesmo Cliente pode realizar Muitos (vários) pedidos.


Chave Primária é o campo no qual não podem haver valores repetidos

O exemplo que eu vou implementar neste artigo vai ser mais simples para tornar bem claro o entendimento a todos os que estão iniciando com a programação orientada a objetos. 

Vou implementar as classes e os métodos sem a ajuda de nenhuma ferramenta, usando apenas o Visual Studio 2013 Express Edition. Lembrando que a solução apresentada apenas é uma das soluções possíveis e não a única solução.

Existem muitos cenários onde podemos implementar um relacionamento um-para-muitos entre duas classes. Vejamos alguns exemplos :

1- Uma classe Pessoa e uma classe Veículo : representando a relação entre uma pessoa e veículos onde uma pessoa pode ser proprietário de mais de um veículo;
2- Uma classe Pessoa e uma classe Conta : representa a relação entre uma pessoa e uma conta bancária onde uma pessoa pode ser possuir mais de uma conta;
3- Uma classe Pessoa e uma classe Dependente : representando a relação entre uma pessoa e seus dependentes onde uma pessoa pode possuir mais de um dependente;
4- Uma classe Cliente e uma classe Pedido: representando a relação entre um cliente e seus pedidos onde um cliente pode possuir mais de um pedido;

E como podemos implementar esses relacionamentos representados pelas associações entre as classes usando a linguagem C# ?

 

Implementando a associação um-para-muitos entre duas classes

 

Para realizar a implementação vamos criar uma nova solução abrindo o VS 2013 for windows desktop e clicando em New Project;

 

A seguir selecione a linguagem Visual C# e o template Console Application informando o nome : Relacionamento_Um_Para_Muitos;

 

 

Vamos começar definindo um classe Cliente e uma classe Dependente onde um cliente pode ter nenhum ou muitos dependentes.

 

- A definição da classe Dependente pode ser feita assim:

 

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

 

Para ficar bem simples defini na classe apenas duas propriedades : Id e Nome.

 

A seguir vamos criar a classe Pessoa com o seguinte código:

 

using System;
using System.Collections.Generic;
namespace Relacionamento_Um_para_Muitos
{
    public class Pessoa
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public List<Dependente> Dependentes;
        public void Imprimir()
        {
            Console.WriteLine(" .: Pessoa :. ");
            Console.WriteLine(" Id      : " + this.Id);
            Console.WriteLine(" Nome : " + this.Nome);
            Console.WriteLine(" ----- Dependentes ----- ");
            foreach(Dependente d in Dependentes)
            {
                Console.WriteLine("Dependente : " + d.Nome);
            }
        }
    }
}

Na classe Pessoa definimos 2 Propriedades e um Campo: Id do tipo int , Nome do tipo string e Dependentes que é uma lista de dependentes.

Campos armazenam os dados que uma classe necessita para cumprir o seu objetivo.( https://msdn.microsoft.com/en-US/library/ms173118%28v=vs.80%29.aspx )
Os campos são inicializados imediatamente antes que o construtor para a instância do objeto seja chamado, por isso, se o construtor atribuir um valor a um campo,
 ele irá substituir qualquer valor dado durante a declaração do campo.

Definimos também o método Imprimir que imprime os dados da Pessoa e seus dependentes.

É a propriedade Dependentes que define o relacionamento muitos para a classe Pessoa.

Vamos agora criar o código abaixo no método Main() onde vamos criar objetos da classe Dependente e Pessoa e imprimir a pessoa e seus dependentes:

using System;
using System.Collections.Generic;
namespace Relacionamento_Um_para_Muitos
{
    class Program
    {
        static void Main(string[] args)
        {
            //cria lista de dependentes
            List<Dependente> lista = new List<Dependente>();
            //cria objeto dependente 
            Dependente d1 = new Dependente();
            d1.Id = 1;
            d1.Nome = "Jessica";
            //cria objetos dependente usando o recurso inicializadores de objetos 
            Dependente d2 = new Dependente { Id = 2, Nome = "Jefferson" };
            Dependente d3 = new Dependente { Id = 3, Nome = "Janice" };
            //inclui os objetos na lista de dependentes
            lista.Add(d1);
            lista.Add(d2);
            lista.Add(d3);
            //cria um objeto Pessoa e atribui a lista de dependentes
            Pessoa p = new Pessoa();
            p.Id = 1;
            p.Nome = "Macoratti";
            p.Dependentes = lista;
            //imprime a pessoa e seus dependentes
            p.Imprimir();
            Console.ReadLine();
        }
    }
}

Executando o projeto iremos obter o seguinte resultado:

Vimos assim como é simples implementar o relacionamento um-para-muitos usando a associação entre duas classes na linguagem C#.

Pegue o projeto completo aqui:  Relacionamentos_Um_Muitos.zip

Quem ama a sua vida perdê-la-á, e quem neste mundo odeia a sua vida, guardá-la-á para a vida eterna.
Se alguém me serve, siga-me, e onde eu estiver, ali estará também o meu servo. E, se alguém me servir, meu Pai o honrará.

João 12:25,26

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti