none
Tipos Complexos em classes RRS feed

  • Pergunta

  • Olá pessoal, 

    Estou desenvolvendo uma aplicação em ASP.NET MVC 3 em N Camadas.

    Atualmente, temos um banco de dados SQL Server 2008, a qual o mesmo também está sendo utilizado em produção por um outro sistema.Estamos utilizando como persistência o Entity Framework 4.1
    Devido a estrutura de tabelas já existentes, não estamos adotando o code first, e sim criando nossas próprias entidades.

    Basicamente a estrutura do projeto está assim:

    Projeto.UI (User Interface)
    Projeto.BLL (Camada de negócio - Exemplo: CarrroBLL.cs)
    Projeto.Domain (Nossas entidades - Exemplo: Carro.cs)
    Projeto.Repository (Está o edmx e suas respectivas classes de persistência - Exemplo: CarroRepository.cs)

    Nas classes Repository, a gente passa como parametro o filtro que deseja, e no retorno do objeto aplicamos os valores no nosso objeto da classe Domain.

    A minha dúvida está aqui:

    Exemplo:

    Tenho uma classe Pruduto, a qual nela eu posso ter as suas propriedades, porém essas propriedades serão propriedades de objetos a qual se relacionam por uma FK com esta tabela.

    Dúvida: O preenchimento de todos os objetos e sub objetos precisam ser feitos diretamente por um join na classe do repository? Pq se for assim, eu iria precisar fazer um join para cada tabela que se relaciona. Não iria ficar pessado? É a forma correta de fazer?

    quinta-feira, 20 de dezembro de 2012 18:38

Respostas

  • O certo é usar os dois:

    CarroTipo e IdCarroTipo.

    E quando vc precisar usar por exemplo o nome do tipo de carro, vc vai usar include para ele trazer na mesma consulta o objeto.

     
    ctx.tb_carro.Include(c=>c.CarroTipo).Where(c => c.IdCarro == id).FirstOdDefault()
    

    • Marcado como Resposta Rodrigo Epic quarta-feira, 2 de janeiro de 2013 19:14
    sexta-feira, 28 de dezembro de 2012 18:41

Todas as Respostas

  • Oi pessoal, para eu ser mais claro:

    Geralmente fazemos isso:

    public class Carro
    {
          public int IdCarro { get; set; }
          public string NomeCarro { get; set; }
          public int IdCarroTipo
    }

    public class CarroTipo
    {
          public int IdCarroTipo { get; set; }
          public string NomeTipo { get; set; }
    }

    Como eu disse, não estou utilizando as entidades do Entity Framework, e assim minhas Classes. Na persistência, eu faço a persistência do meu modelo para o banco e vice versa.

    Na controle eu alimento meu objeto normalmente.

    Carro carro = new CarroBLL().ObterCarroPorId(id);
    return View(carro)

    Porém, eu não gostaria que fica-se o id do tipo no objeto Carrro. Eu gostaria que no lugar eu tive-se um outro objeto.

    Exemplo:

    public class Carro
    {
          public int IdCarro { get; set; }
          public string NomeCarro { get; set; }
          public CarroTipo CarroTipo { get; set; }
    }

    Assim, eu não tenho mais uma propriedade com o id e sim  já todo o objeto.

    A minha dúvida é como fazer isso na persistência, eu tentei utilizar linq utilizando lambda para ficar mais ou menos assim:

    Carro carro = ctx.tb_carro
                            .Where(c => c.IdCarro == id)
                            .Join(ctx.tb_CarroTipo, c => c.IdCarroTipo, ct => ct.IdCarroTipo, (c, ct) => new { c, ct })
                            => new Carro
                            {
                                 Id = c.IdCarro, 
                                 NomeCarro = c.NomeCarro,
                                 CarroTipo = ct
                             }).FirstOrDefault();

    Ou seja, na query acima, CarroTipo é uma propriedade de objeto.

    Assim quando eu estiver na aplicação eu posso acessar ela assim:

    @Model.Carro.CarroTipo.Propriedade
    Exemplo: @Model.Carro.CarroTipo.NomeTipo

    Se eu estive-se utilizando o FirstCode do EF, poderia utilizar o navigation properties, mas preciso utilizar minhas próprias classes.

    sexta-feira, 21 de dezembro de 2012 11:13
  • Rodrigo Epic, também estou com o mesmo problema.

    Pessoal, alguém teria uma idéia?

    Abs!!!

    sexta-feira, 21 de dezembro de 2012 17:57
  • O certo é usar os dois:

    CarroTipo e IdCarroTipo.

    E quando vc precisar usar por exemplo o nome do tipo de carro, vc vai usar include para ele trazer na mesma consulta o objeto.

     
    ctx.tb_carro.Include(c=>c.CarroTipo).Where(c => c.IdCarro == id).FirstOdDefault()
    

    • Marcado como Resposta Rodrigo Epic quarta-feira, 2 de janeiro de 2013 19:14
    sexta-feira, 28 de dezembro de 2012 18:41
  • Muito obrigado Danimar, no caso, 

    Estou fazendo de uma forma diferente, pode me dizer se é errado?

    Exemplo:

    Tenho os projetos:

    UI
    BLL
    Domain
    Repository

    Na repository eu criei um edmx com as entidades que estão mapeando as tabelas no banco. Mas eu não estou utilizando essas entidades do EF, pq o nome das tabelas possuem uma nomenclatura diferente  e eu também não quero seguir pelo modelo físico e sim de acordo com a regra de negócio.

    Bom continuando, no projeto Domain, eu estou criando todas as minhas classes de acordo com o meu negócio.

    Na hora de realizar a persistência, exemplo pegar um objeto do banco, eu preencho um objeto do DataContext no Repository e depois passo para meu objeto da Domain.

    Assim:


    Vaga vaga = new Vaga()
                    {
                        Id = dados.int_id_vaga,
                        IdCliente = Convert.ToInt32(dados.int_id_empresa),
                        IdCargo = Convert.ToInt32(dados.int_id_cargo),
                        IdHierarquia = Convert.ToInt32(dados.int_id_hierarquia),

    ... sucessivamente..

    E quando eu tenho propriedades de objetos exemplo:

    eu faço preencho ele assim:

    vaga.Cargo = new CargoRepository().ObterCargoPorId(vaga.IdCargo);

    quarta-feira, 2 de janeiro de 2013 19:20