none
Dependência Cíclica com o ADO Entity Framework

    Question

  • Tenho por exemplo uma tabela "Cliente" e ligada a ela tenho a tabela de "Produtos", ou seja, um cliente pode ter N Produtos e os Produtos podem ter N Clientes.
    Ocorre que ao carregar as entidades, elas entram em loop pois uma carrega uma lista da outra.
    Alguem já teve problemas com isso?



    Abraços, Pedro Seixas
    Tuesday, May 19, 2009 2:44 PM

Answers

  • Esse erro acontece pq dá um stack overflow lá no provider e ele não consegue passar essa exceção pra camada que o consome. Pra contornar isso, nesse método dentro do provider vc tem que criar um meio para que esse loop ciclico não aconteça. Uma técnica comum é criar um overload privado desse método dentro dessa classe que recebe um hashtable de parametro, aí pra pegar os filhos vc chama esse método recursivamente e vc controla se não pegou o mesmo cara duas vezes através desse hash. Vc verifica se o Id dessa entidade já está no hash antes de qualquer coisa, se já estiver, vc dá o return no método e aí ele não faz o loop ciclico, pois percorre somente uma vez cada entidade. Qualquer coisa põe seu código q eu tento ajudar.


    Edit: se bem que cliente ter produtos e produtos ter cliente é meio estranho, não tem como alterar essa modelagem? vc poderia tirar os clientes de produtos, pois logo que sua base de dados começar a crescer, ao buscar um único produto vc traz praticamente a base inteira Oo'
    Wednesday, May 20, 2009 11:33 AM

All replies

  • Prezado,

    Nossa, como foi implementado o modelo de dados dessa situação?

    Qual erro que você está obtendo? Em qual momento está ocorrendo o erro?
    André Alves de Lima - http://andrealveslima.spaces.live.com
    Tuesday, May 19, 2009 9:28 PM
    Moderator
  • Fala André,
    Na verdade o erro é bem estranho pois só acontece quando existem mais de 3 links com outras tabelas (objetos filhos dentro de um objeto pai). Quando é menos que isso tudo funciona normal! O_o
    O controller (estamos usando MVC) faz acesso a um serviço que acessa um provider. O erro ocorre quando o provider dá o "return" pro serviço.

    O erro é algo como "A conexão subjacente fechou de forma inesperada". O problema é que esse erro não faz muito sentido, pois isso só ocorre 1 método do serviço, todos os outros fazem coisas similares e funcionam normalmente.

    Até hj não tinha me deparado com esse problema.

    Abraços,
    Pedro Seixas
    Wednesday, May 20, 2009 12:08 AM
  • Esse erro acontece pq dá um stack overflow lá no provider e ele não consegue passar essa exceção pra camada que o consome. Pra contornar isso, nesse método dentro do provider vc tem que criar um meio para que esse loop ciclico não aconteça. Uma técnica comum é criar um overload privado desse método dentro dessa classe que recebe um hashtable de parametro, aí pra pegar os filhos vc chama esse método recursivamente e vc controla se não pegou o mesmo cara duas vezes através desse hash. Vc verifica se o Id dessa entidade já está no hash antes de qualquer coisa, se já estiver, vc dá o return no método e aí ele não faz o loop ciclico, pois percorre somente uma vez cada entidade. Qualquer coisa põe seu código q eu tento ajudar.


    Edit: se bem que cliente ter produtos e produtos ter cliente é meio estranho, não tem como alterar essa modelagem? vc poderia tirar os clientes de produtos, pois logo que sua base de dados começar a crescer, ao buscar um único produto vc traz praticamente a base inteira Oo'
    Wednesday, May 20, 2009 11:33 AM