Olá Marcelo
Quando carregamos uma entidade pelo entity framework, por exemplo, o produto que é utilizado no curso, o framework envia uma query apenas para a tabela de produtos, a tabela de categorias não é acessada, ela só é acessada quando a utilizamos no código:
// Essa linha consulta apenas a tabela de produtos
// A categoria ainda não foi carregada do banco de dados.
Produto produto = contexto.Produtos.Find(1);
// Nessa linha estamos tentando utilizar a categoria
// e, por isso, ela é carregada do banco de dados.
// Nessa linha o Entity Framework faz a consulta
// na tabela de categorias
Console.WriteLine(produto.Categoria.Nome);
O exemplo utilizado no curso é quase igual ao descrito acima:
// Nessa linha o Entity Framework só faz a consulta
// na tabela de produtos do banco de dados. A
// categoria ainda não foi carregada
IEnumerable<Produto> produtos = contexto.Produtos;
foreach(var produto in produtos)
{
// Nessa linha estamos tentando utilizar a categoria
// e por isso o Entity Framework precisa
// executar uma busca no banco de dados para
// carregar a categoria do produto.
Console.WriteLine(produto.Categoria.Nome);
}
O problema nesse segundo caso é que quando estamos iterando na lista de produtos, o Entity Framework ainda está recebendo o resultado do banco de dados, a query para listar os produtos ainda não terminou de ser executada, e a aplicação está tentando carregar a lista de produtos enquanto um outro comando está sendo executado, portanto temos dois comandos simultâneos para o banco de dados, o que normalmente não deveria acontecer.