none
Como selecionar ID em relacionamento N:N RRS feed

  • Pergunta

  • Boa noite! Tenho um relacionamento N:N entre as tabelas Contas, e Responsaveis. Preciso saber como que consigo armazenar em uma lista todos os ID's de responsaveis daquela conta. O relacionamento segue abaixo:

    O código que fiz foi:

     public ActionResult Edit(int id)
            {
                contas contas1 = db.contas.Single(c=> c.IdContas == id);
                var ListaIdsResponsaveis = db.contas.Include("responsavelporconta").Single(c => c.IdContas == id); 
    }

    segunda-feira, 8 de outubro de 2012 23:20

Respostas

  • O Find pertence ao DbSet, portanto você só conseguirá usar se 'contas' for um DbSet..

    Se o 'contas' for um ObjectSet, então você terá que usar o Single(o => o.Id == id).

    Tenta:

    var ListaIdsResponsaveis = db.contas
    .Include("responsavelporconta")
    .Single(c => c.IdContas == id)
    .Responsaveis
    .Select(r => r.id)
    .ToList();

    http://www.linkedin.com/pub/murilo-kunze/44/191/455



    • Editado Murilo Kunze terça-feira, 9 de outubro de 2012 16:41
    • Marcado como Resposta Kakashi963 segunda-feira, 15 de outubro de 2012 12:54
    terça-feira, 9 de outubro de 2012 16:26
  • Eu também não. Pesquisei e parece que não mesmo. A saída é usar o SingleOrDefault().

    var responsaveis = db.Contas.SingleOrDefault(c=>c.Id == SEU_ID).Responsaveis.ToList();

    O EDMX é algo muito questionado no Entity Framework. O código que ele gera é um pouco confuso e difícil de extender,

    Eu aconselho usar Code First, tem alguns vídeos que mostro isso:
    http://andrebaltieri.net/2012/04/09/criando-um-catlogo-de-produtos-com-asp-net-mvc-e-entity-framework-pt-1/

    Outra saída é gerar as classes do banco usando o EF Power Tools
    http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx

    Abraços,


    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net

    • Marcado como Resposta Kakashi963 segunda-feira, 15 de outubro de 2012 12:53
    terça-feira, 9 de outubro de 2012 16:42
  • Só uma observação. Use SingleOrDefault se você tiver certeza que vai retornar apenas 1 elemento pois se retornar mais de um vai da erro no seu código. Pra evitar isso sempre uso FirstOrDefault.

    1000ton Analista de Sistema Plastripel - Barretos @MiltonFilho

    • Marcado como Resposta Kakashi963 segunda-feira, 15 de outubro de 2012 12:53
    terça-feira, 9 de outubro de 2012 19:21

Todas as Respostas

  • kakashi,

    Na entidade responsáveis você tem uma lista de contas, e na de contas uma lista de responsáveis

    Para saber os responsáveis de uma conta, você pode fazer o seguinte

    var responsaveis = db.Contas.Find(ID_CONTA).Responsaveis.ToList();

    O mesmo serve para saber as contas do responsável.

    Abraços,


    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net

    • Sugerido como Resposta Murilo Kunze terça-feira, 9 de outubro de 2012 11:30
    terça-feira, 9 de outubro de 2012 00:16
  • André, bom dia!

    Mas este comando não funcionou, não enxerga o metodo Find(), da erro.

    terça-feira, 9 de outubro de 2012 15:00
  • contas é um DbSet?

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 9 de outubro de 2012 15:24
  • Coloca no topo da p;agina:

    using System.Linq;

    Abraços,


    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net

    terça-feira, 9 de outubro de 2012 15:38
  • O Find pertence ao DbSet, portanto você só conseguirá usar se 'contas' for um DbSet..

    Se o 'contas' for um ObjectSet, então você terá que usar o Single(o => o.Id == id).

    Tenta:

    var ListaIdsResponsaveis = db.contas
    .Include("responsavelporconta")
    .Single(c => c.IdContas == id)
    .Responsaveis
    .Select(r => r.id)
    .ToList();

    http://www.linkedin.com/pub/murilo-kunze/44/191/455



    • Editado Murilo Kunze terça-feira, 9 de outubro de 2012 16:41
    • Marcado como Resposta Kakashi963 segunda-feira, 15 de outubro de 2012 12:54
    terça-feira, 9 de outubro de 2012 16:26
  • Por Default o EDMX gera DbSets não gera?

    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net

    terça-feira, 9 de outubro de 2012 16:33
  • Outra coisa, se você usar o Single e não existir um objeto com o Id mencionado, vai gerar um erro, caso use o SingleOrDefault se não existir o objeto o resultado é nulo.

    Abraços,


    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net

    terça-feira, 9 de outubro de 2012 16:34
  • Eu acho que não cara =/

    Não tenho ctz.. nunca uso hehe.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 9 de outubro de 2012 16:34
  • Eu também não. Pesquisei e parece que não mesmo. A saída é usar o SingleOrDefault().

    var responsaveis = db.Contas.SingleOrDefault(c=>c.Id == SEU_ID).Responsaveis.ToList();

    O EDMX é algo muito questionado no Entity Framework. O código que ele gera é um pouco confuso e difícil de extender,

    Eu aconselho usar Code First, tem alguns vídeos que mostro isso:
    http://andrebaltieri.net/2012/04/09/criando-um-catlogo-de-produtos-com-asp-net-mvc-e-entity-framework-pt-1/

    Outra saída é gerar as classes do banco usando o EF Power Tools
    http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power-tools-ctp1-released.aspx

    Abraços,


    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net

    • Marcado como Resposta Kakashi963 segunda-feira, 15 de outubro de 2012 12:53
    terça-feira, 9 de outubro de 2012 16:42
  • Só uma observação. Use SingleOrDefault se você tiver certeza que vai retornar apenas 1 elemento pois se retornar mais de um vai da erro no seu código. Pra evitar isso sempre uso FirstOrDefault.

    1000ton Analista de Sistema Plastripel - Barretos @MiltonFilho

    • Marcado como Resposta Kakashi963 segunda-feira, 15 de outubro de 2012 12:53
    terça-feira, 9 de outubro de 2012 19:21
  • Milton,

    Como neste caso a busca é pelo Id (Espero que seja único) ele não retorna mais que 1 resultado.

    Abraços,


    Se sua questão foi respondida, favor marcar.

    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net
    Site: http://sismat.com.br

    terça-feira, 9 de outubro de 2012 19:23
  • Deu certo hehe. Obrigado a todos!
    segunda-feira, 15 de outubro de 2012 12:55