Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro ao recuperar Cinemas com endereços

Estou usando o .NET 6 e o sistema Linux com o MySql rodando no docker, e obitive o seguinte erro apenas ao listar os cinemas com endereços cadastrados, uma mudança que fiz em relação ao projeto nas aulas foi não utilizar o automapper, fazendo o mapeamento das entidades na mão, o que notei e que os dados veem corretamente do banco de dados, o mapeamento e feito, porém quando retorna a requisição que o erro ocorre. Fora o uso do automapper, o código está exatamente igual o das aulas, e está aparecendo esses erros.

Esse e o que o postman recebe:Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E o que aparece no log quando está rodando o programa: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas
solução!

Boa tarde!

A impressão que dá é que você está iterando o seu IQueryable e o EF Core está fazendo múltiplas chamadas em paralelo pro banco de dados. O DbContext do EF Core não é thread-safe, aí acaba dando erro.

Antes de você converter o seu IQueryable, tenta trazer ele pra memória primeiro. Dê um ".ToList()" ou ".ToListAsync()" nele e faça a iteração da lista retornada.

A sim, após usar o .ToList() resolvel o problema. Teria algum material para indica que fala sobre isso de trazer para a memória primeiro, essa parte ainda est

Acredito que isso possa ajudar:

https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/query-execution

Mas em resumo, quando você está trabalhando com o Entity Framework e usando IQueryable, você não vai no banco assim que cria o LINQ. A expressão fica ali pronta para o uso. Você só vai realmente no banco após executar algum método ou fazer uma conversão (por exemplo, iterar e acabar virando um IEnumerable). Os métodos mais comuns para executar a consulta "Imediata" são o ToList, ToArray e Count, mas outros também fazem o trabalho. A partir do momento que você chama eles, você está explicitando sua vontade de realmente renderizar a consulta e fazer a solicitação pro banco de dados. Uma vez que a consulta é executada, vai ficar na memória dentro do seu List ou IEnumerable.

Ok, darei uma olhada, agradeço a todos pela ajuda.