none
Dúvida Lazy Loading, carregar entidade filha RRS feed

  • Pergunta

  • Bom dia senhores.

    Tenho a seguinte dúvida, tenho a uma entidade A que tem uma propriedade para a Entidade B, quando faço datacontext.Set<A>().where(a=>a.B.Name == "Valor") estoura uma exception.

    Quando faço datacontext.Set<A>().ToList().where(a=>a.B.Name == "Valor") ele faz o filtro na entidade B, alguém sabe me dizer por que? Porque quando chamo o ToList() ele carrega tudo no contexto do aplicativo certo?

    quarta-feira, 5 de junho de 2013 13:44

Respostas

  • Amigo, 

    você quer saber o por que dele tentar carrega a entidade B ? por que você tentou acessar uma propriédade desta entidade referênciada. tente antes do where colocar um .Include("NOMEENTIDADE").where.. 

    assim ele irá carregar a entidade


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Facebook Olavo Neto
    Linkedin Olavo Neto
    Se for útil marque como resposta e faça um Developer feliz :)

    quinta-feira, 6 de junho de 2013 17:13
  • Olá César,

    Duas perguntas, então terá duas respostas...

    Pergunta 1 => provavelmente vc esta recebendo "um Object not set to instance of an object" quando executa a sua query. Isso ocorre porque alguma tupla da tabela A no seu banco de dados nãoesta associada com uma instância da tabela B. Neste caso mude a sua query para algo como:

    var query = datacontext.Set<A>().where(a => a.B != null && a.B.Name == "Valor");

    Pergunta 2 => Esse modo de fazer a query é bastante errado, pois quando vc executa o "ToList()" vc força a execução da query, isso siginifica execução de SQL, mais mapeamento dos resultados e consumo de memória com os seus resultados. Assim, o EF vai trazer todos os dados da tabela A para a memória (péssima ideia) e então vai filtrar os dados que estão em memória atrás das entidades de B que se adequam ao seu filtro.

    Qual exception vc esta recebendo ao executar a primeira query?

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Visual C#
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    segunda-feira, 10 de junho de 2013 12:20
    Moderador
  • Opa fernando blz, então na verdade eu resolvi da seguinte forma.

    //Adicionei

    using System.Data.Entity

    //Coloquei o include tipado.

    //Acredito que seja a forma correta de se fazer.

    datacontext.Set<A>().Include(a=>a.B).where(a=>a.B.Name == "Valor")

    terça-feira, 11 de junho de 2013 19:20

Todas as Respostas

  • Amigo, 

    você quer saber o por que dele tentar carrega a entidade B ? por que você tentou acessar uma propriédade desta entidade referênciada. tente antes do where colocar um .Include("NOMEENTIDADE").where.. 

    assim ele irá carregar a entidade


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Facebook Olavo Neto
    Linkedin Olavo Neto
    Se for útil marque como resposta e faça um Developer feliz :)

    quinta-feira, 6 de junho de 2013 17:13
  • Olá César,

    Duas perguntas, então terá duas respostas...

    Pergunta 1 => provavelmente vc esta recebendo "um Object not set to instance of an object" quando executa a sua query. Isso ocorre porque alguma tupla da tabela A no seu banco de dados nãoesta associada com uma instância da tabela B. Neste caso mude a sua query para algo como:

    var query = datacontext.Set<A>().where(a => a.B != null && a.B.Name == "Valor");

    Pergunta 2 => Esse modo de fazer a query é bastante errado, pois quando vc executa o "ToList()" vc força a execução da query, isso siginifica execução de SQL, mais mapeamento dos resultados e consumo de memória com os seus resultados. Assim, o EF vai trazer todos os dados da tabela A para a memória (péssima ideia) e então vai filtrar os dados que estão em memória atrás das entidades de B que se adequam ao seu filtro.

    Qual exception vc esta recebendo ao executar a primeira query?

    []s!


    MSc. Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Visual C#
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    segunda-feira, 10 de junho de 2013 12:20
    Moderador
  • Opa fernando blz, então na verdade eu resolvi da seguinte forma.

    //Adicionei

    using System.Data.Entity

    //Coloquei o include tipado.

    //Acredito que seja a forma correta de se fazer.

    datacontext.Set<A>().Include(a=>a.B).where(a=>a.B.Name == "Valor")

    terça-feira, 11 de junho de 2013 19:20