none
MVC 2 EDM - Dúvida RRS feed

  • Pergunta

  • Olá Pessoal,

    Sou iniciante no uso de mvc para asp.net. Estou com uma dúvida que acredito ser básica para vcs.

    A partir de uma base SQL Server, criei meu Entity Data Model (edm) e, a partir deste, minhas Views e Controllers. Então, para cada tabela, foi criado um controller contendo os métodos Index, Create, Edit...

    Nesse modelo, existe uma relação entre as tabelas Usuario (fk_id_tipo_usuario) e Tipo do Usuario (id_tipo_usuario). Exemplo, um usuário pode ser do tipo Administrador, Coordenador, etc.

    Então gostaria de exibir na listagem dos usuários a descrição do tipo dele (Administrador...), em vez do valor fk_id_tipo_usuario. O problema é que se modifico a consulta LINQ, fazendo o join entre as duas tabelas, e então retorno a View, recebo o erro de que estou tentando retornar uma View de tipo desconhecido, quando a View do tipo Usuario é esperada.

    A questão é a seguinte:

    Quero retornar a listagem de usuários, porém com o valor da descrição do tipo de usuario (tabela TipoUsuario), para uma View que espera o tipo Usuario.

    (1) É possível retornar dados adicionais (descrição do tipo do usuario), para cada linha da listagem, para uma View, sem modificar o modelo gerado a partir da própria base de dados?

    (2) Caso não seja possível, em vez de usar a própria classe Usuário gerada através do banco de dados, vou precisar criar a minha própria classe só porque preciso da descrição que está em outra tabela?

    Muito Obrigado!

    Abraços,

     

    segunda-feira, 7 de novembro de 2011 13:09

Todas as Respostas

  • 1 - Sim

    2 - Eu acho interessante criar uma classe (DTO) e retornar ela somente com os campos que você precisa.


    --
    Marque as respostas e ajude a melhorar a busca do fórum. pcfviana@gmail.com
    segunda-feira, 7 de novembro de 2011 14:01
  • Muito obrigado pela resposta Paulo!

    Com relação a primeira pergunta, como faço então para retornar essas informações adicionais para cada linha retornada da query LINQ? Posso utilizar o ViewData? Pode me dar um exemplo?

    Obrigado!

    Abraços!

    segunda-feira, 7 de novembro de 2011 15:00
  • Geralmente você consegue acessar as informações atraves das propriedades do seu objeto.


    --
    Marque as respostas e ajude a melhorar a busca do fórum. pcfviana@gmail.com
    segunda-feira, 7 de novembro de 2011 15:49
  • Tudo bem, realmente o mais razoável seria adicionar um atributo. Mas esqueci de comentar que quando adiciono uma nova propriedade (atributo) na classe gerada (edm), ocorre um erro. Talvez pq essa propriedade não esteja relacionada a nenhum campo da tabela mapeada na classe...

    Obrigado.

     

    terça-feira, 8 de novembro de 2011 15:53
  • Você diz quando cria uma nova coluna no banco?? Neste caso tem que atualizar o modelo!
    --
    Marque as respostas e ajude a melhorar a busca do fórum. pcfviana@gmail.com
    terça-feira, 8 de novembro de 2011 15:57
  • Oi Paulo!

    Por exemplo,

    No método Index, da classe controller (tabela Usuario), faço a seguinte query:

     

    var usuario = from usu in caft_ent.Usuario join tipo_usu in caft_ent.TipoUsuario on usu.fk_tipoUsuario equals tipo_usu.id_tipoUsuario select new { id_usuario=usu.id_usuario, tipo_usu.descricao, nome=usu.nome, telefone=usu.telefone, sexo=usu.sexo, login_email=usu.login_email, valido = usu.valido};

    ...

    return

     

     

    View(usuario.ToList());

    Note que estou querendo retornar a descrição do tipo do Usuário, que está em outra tabela (TipoUsuario). O campo tipo_usu.descricao é a descrição do usuário que quero retornar para dentro da View Usuario, que não exite na tabela Usuário. Então acabo recebendo o erro abaixo:

    "The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[<>f__AnonymousType0`7[System.Int32,System.String,System.String,System.String,System.String,System.String,System.Int32]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[CAFT.Usuario]'."

    Queria então saber uma forma de retornar essa informação, sem que isso afete o modelo de Banco de dados. Ou seja, sem que eu precise criar um campo (propriedade ou atributo) na tabela Usuario (ex.: descricao_tipo_usuario).

    Obrigado pela atenção!

    Abraços!

    

    quarta-feira, 9 de novembro de 2011 01:23
  • Reescreva sua query Linq usando include ao invés de join:

    var usuario = (from usu in caft_ent.Usuario.Include("TipoUsuario") select new {..., tipo = usu.TipoUsuario.Descricao, ... }

    quinta-feira, 10 de novembro de 2011 14:26
    Moderador
  • Muito Obrigado João! Vou tentar fazer isso e retorno pra dizer se funcionou.

    Grande abraço!

    sexta-feira, 11 de novembro de 2011 12:53
  • Fala João!

    Ocorreu o mesmo erro... :(

    Segue a Query:

     

    var usuario = from usu in caft_ent.Usuario.Include("fk_descTipoUsuario") join tipo_usu in caft_ent.TipoUsuario on usu.fk_tipoUsuario equals tipo_usu.id_tipoUsuario select new

    { id_usuario=usu.id_usuario,fk_descTipoUsuario = tipo_usu.descricao, nome=usu.nome,telefone=usu.telefone,sexo=usu.sexo,login_email=usu.login_email,valido = usu.valido};

    Abraços!

    domingo, 13 de novembro de 2011 13:40
  • No "Include" você não coloca a chave estrangeira e sim a tabela que tem a chave.

    Outro detalhe, veja como sua view está tipada. Se você está usando um view "tipada" não pode passar um tipo genérico pra mesma. É essa a mensagem de erro que está dando.

    E no Include você não precisa de Join.

    Sugestão: crie uma View no banco de dados para pegar somente os dados que você precisa. Refaça seu EDMX e recupere os dados pela view.

    • Sugerido como Resposta hamiltonj quarta-feira, 23 de novembro de 2011 15:24
    quarta-feira, 16 de novembro de 2011 18:51
    Moderador
  • Com o Include resolve o problema como eu acabara de resolver.

    Exemplo:
    Controller
    using (Contexto db = new Contexto())
    {
          var model = from u in db.Usuario.Include("Perfil")                                 
                              select  u;                                 
                        return View(model.ToList());
    }

    View
    @foreach (var item in Model)
    {
         <tbody>
                <tr>
                   <td>@Html.DisplayFor(modelItem => item.Perfil.Descricao)</td>
                </tr>
         </tbody>
    }

    Fiz o select na tabela usuário para pegar a descrição do perfil como: 
    item.NomeTabela.CampoDesejado

    Aislan Miranda

    quinta-feira, 23 de maio de 2013 03:36