none
Relacionamento entre classes RRS feed

  • Pergunta


  • Cenário:
    Tenho duas classes, uma  classe evento e uma classe sala e um relacionamento entre elas


    Ao instanciar uma a classe sala, precisa pegar o nome do evento, que esta na classe Evento, como uma propriedade..

    Devo trabalhar da maneira abaixo, instanciando a classe Evento dentro da classe sala como uma propriedade?

    1public Evento Evento 
    2        { 
    3            get 
    4            { 
    5                if(eventoPai == null
    6                    eventoPai = new Evento(99); //aqui eu instancio a classe evento.. 
    7 
    8                return eventoPai; 
    9            } 
    10        } 
    11 
    12 


    para recuperar o nome do evento:

    1Sala sala = new Sala(); 
    2string evento = sala.Evento.Nome 

    Alguma outra sugestão de como trabalhar com relacionamento entre as classes?

    obrigado

    quinta-feira, 26 de fevereiro de 2009 16:53

Respostas

  • Olá Andre,
    o conceito de lazy load seria perfeito para o seu caso, mas você teria que codificar tudo isso.
    Utilizando qualquer sistema ORM facilitaria isso para você. Na minha opinião, nHibernate está mais maduro que o Linq to Entities, apesar dos dois apresentarem mecanismos para Lazy Load. No Linq to Entities é um pouco mais chato, porém é possível.

    Abraços.
    André Nobre
    quinta-feira, 2 de abril de 2009 16:44
  • Concordo com o André quanto o NHibernate ser bem mais maduro. Além de implementar melhor "Ignorance Persistence", e Lazy Load, ele não tem problemas quanto a serialização. No caso do Linq quando temos um relacionamento bidirecional existe um problema na serialização do linq. (Tendo os seus workarounds).

    Outro ponto que vale lembrar, é vc pode definir a navegabilidade das tuas associações, ou seja:
    Para o caso Categoria 1 - N Produtos

    Não necessariamente precisaremos ter essa coleção de produtos em categoria. Se você sempre utilizar apenas Produtos estão em Categoria X. 

    quarta-feira, 8 de abril de 2009 17:32
  • Depende um pouco de qual contexto estas classes estão.
    Estou supondo do modo + convencional, onde sejam classes referentes a entidades de negócio. Sendo assim, na classe sala, criaria uma propriedade chamada Eventos (que é uma List<Evento> associados a esta sala) e uma propriedade do mesmo tipo.

    No Get desta propriedade, utilizaria uma técnica chamada Lazy Load, que é o seguinte. Se o atributo List<Evento> estiver nulo, consulto a base de dados, carrego todos os eventos associados a esta classe e retorno a lista preenchida.

    Para pegar o nome, pegaria sala.Eventos[0].Nome;

    Até +,
    Bruno Gallego
    Bruno Gallego - Se este poste foi útil, por favor, classifique
    sábado, 28 de fevereiro de 2009 00:14
  • Bruno, uma dúvida que tenho à um tempo.
    Caso eu tenha por exemplo a seguinte hierarquia:

    - Campeonato
     +  Time
       +   Jogador

    Onde no campeonato tenho uma lista de times e cada time tem uma lista de jogadores.
    Vc carregando o campeonato, já carregaria todos os times e jogadores?
    Ou faria por partes?

    Pois imagina se tiver 1000 time, cada um com +- 22 jogadores.
    Não teria um estouro de memória?

    Abraços
    Inside .NET - O portal do desenvolvedor .NET
    http://www.insidedotnet.com.br/
    andre.baltieri@insidedotnet.com.br
    terça-feira, 31 de março de 2009 18:24
  • Olá Andre,
    entrando de gaiato na conversa :), não obrigatóriamente haverá estouro de memória. Porém, seria uma melhor prática utilizar uma abordagem do tipo Lazy Load (http://martinfowler.com/eaaCatalog/lazyLoad.html).

    Abraços.
    -- André Nobre
    André Nobre
    quinta-feira, 2 de abril de 2009 11:56
  • Fala André, blza?
    Então cara..
    O problema é quando se tem uma massa muito grande de dados..

    Pesquisando descobri q o nHibernate tem um controle para ver quão profundo vc quer descer na estrutura.. Pai > FIlho > Neto etc..

    Na verdade neste novo sistema gostaria de utilizar LINQ To Entities..
    O que acha?

    Abraços
    Inside .NET - O portal do desenvolvedor .NET
    http://www.insidedotnet.com.br/
    andre.baltieri@insidedotnet.com.br
    quinta-feira, 2 de abril de 2009 13:07
  • Caros, lembrando apenas que o NHibernate agora possui Linq to NHibernate. Ainda não testei, mas pela qualidade das coisas que o Ayende faz, é bem promissor.

    Como funciona:
    Poderiamos usar Linq com NHibernate antes, entretanto as consultas seriam feitas em memória apenas, com o Linq to Sql, suas consultas Linq serão transformadas em Critérios e executadas pelo Nhibernate  (ISession ), ou sejam viram consultas Nhibernate e posteriormente Sql. Vale acompanhar enquanto o Entity versão 2 não sai.


    Lobo Junior Analista de Sistemas http://alcateiadigital.blogspot.com/
    quinta-feira, 9 de abril de 2009 01:01

Todas as Respostas

  • Depende um pouco de qual contexto estas classes estão.
    Estou supondo do modo + convencional, onde sejam classes referentes a entidades de negócio. Sendo assim, na classe sala, criaria uma propriedade chamada Eventos (que é uma List<Evento> associados a esta sala) e uma propriedade do mesmo tipo.

    No Get desta propriedade, utilizaria uma técnica chamada Lazy Load, que é o seguinte. Se o atributo List<Evento> estiver nulo, consulto a base de dados, carrego todos os eventos associados a esta classe e retorno a lista preenchida.

    Para pegar o nome, pegaria sala.Eventos[0].Nome;

    Até +,
    Bruno Gallego
    Bruno Gallego - Se este poste foi útil, por favor, classifique
    sábado, 28 de fevereiro de 2009 00:14
  • ola

    Eu estou trabalhando com o .NET 1.1.. Não tenho a opção de generics (List<evento>).

    Como eu poderia trabalhar??
    segunda-feira, 2 de março de 2009 11:37
  • Bruno, uma dúvida que tenho à um tempo.
    Caso eu tenha por exemplo a seguinte hierarquia:

    - Campeonato
     +  Time
       +   Jogador

    Onde no campeonato tenho uma lista de times e cada time tem uma lista de jogadores.
    Vc carregando o campeonato, já carregaria todos os times e jogadores?
    Ou faria por partes?

    Pois imagina se tiver 1000 time, cada um com +- 22 jogadores.
    Não teria um estouro de memória?

    Abraços
    Inside .NET - O portal do desenvolvedor .NET
    http://www.insidedotnet.com.br/
    andre.baltieri@insidedotnet.com.br
    terça-feira, 31 de março de 2009 18:24
  • Olá Andre,
    entrando de gaiato na conversa :), não obrigatóriamente haverá estouro de memória. Porém, seria uma melhor prática utilizar uma abordagem do tipo Lazy Load (http://martinfowler.com/eaaCatalog/lazyLoad.html).

    Abraços.
    -- André Nobre
    André Nobre
    quinta-feira, 2 de abril de 2009 11:56
  • Fala André, blza?
    Então cara..
    O problema é quando se tem uma massa muito grande de dados..

    Pesquisando descobri q o nHibernate tem um controle para ver quão profundo vc quer descer na estrutura.. Pai > FIlho > Neto etc..

    Na verdade neste novo sistema gostaria de utilizar LINQ To Entities..
    O que acha?

    Abraços
    Inside .NET - O portal do desenvolvedor .NET
    http://www.insidedotnet.com.br/
    andre.baltieri@insidedotnet.com.br
    quinta-feira, 2 de abril de 2009 13:07
  • Olá Andre,
    o conceito de lazy load seria perfeito para o seu caso, mas você teria que codificar tudo isso.
    Utilizando qualquer sistema ORM facilitaria isso para você. Na minha opinião, nHibernate está mais maduro que o Linq to Entities, apesar dos dois apresentarem mecanismos para Lazy Load. No Linq to Entities é um pouco mais chato, porém é possível.

    Abraços.
    André Nobre
    quinta-feira, 2 de abril de 2009 16:44
  • Obrigado André.
    Eu estava afim de implementar LINQ To Entities, mas creio que o nHibermate é mais maduro e será mais fácil de implementar.

    Abraços
    Inside .NET - O portal do desenvolvedor .NET
    http://www.insidedotnet.com.br/
    andre.baltieri@insidedotnet.com.br
    quinta-feira, 2 de abril de 2009 18:19
  • Concordo com o André quanto o NHibernate ser bem mais maduro. Além de implementar melhor "Ignorance Persistence", e Lazy Load, ele não tem problemas quanto a serialização. No caso do Linq quando temos um relacionamento bidirecional existe um problema na serialização do linq. (Tendo os seus workarounds).

    Outro ponto que vale lembrar, é vc pode definir a navegabilidade das tuas associações, ou seja:
    Para o caso Categoria 1 - N Produtos

    Não necessariamente precisaremos ter essa coleção de produtos em categoria. Se você sempre utilizar apenas Produtos estão em Categoria X. 

    quarta-feira, 8 de abril de 2009 17:32
  • É, LINQ To Entities tá ____.
    Só encontro os mesmo exemplos de sempre.

    o jeito vai ser partir para Spring.NET ou NHibernate, n vou ter mais tempo para analisar e aprender linq para este projeto.

    Obrigado pessoal.

    Abraços
    Inside .NET - O portal do desenvolvedor .NET
    http://www.insidedotnet.com.br/
    andre.baltieri@insidedotnet.com.br
    quarta-feira, 8 de abril de 2009 17:43
  • Caros, lembrando apenas que o NHibernate agora possui Linq to NHibernate. Ainda não testei, mas pela qualidade das coisas que o Ayende faz, é bem promissor.

    Como funciona:
    Poderiamos usar Linq com NHibernate antes, entretanto as consultas seriam feitas em memória apenas, com o Linq to Sql, suas consultas Linq serão transformadas em Critérios e executadas pelo Nhibernate  (ISession ), ou sejam viram consultas Nhibernate e posteriormente Sql. Vale acompanhar enquanto o Entity versão 2 não sai.


    Lobo Junior Analista de Sistemas http://alcateiadigital.blogspot.com/
    quinta-feira, 9 de abril de 2009 01:01