5
respostas

Não exibiu a query no console

Executei a classe main , conforme o exemplo porém, não mostrou a query no console, abaixo o código

using ConsoleApp1;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;

namespace Alura.Loja.Testes.ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var contexto = new LojaContext())
            {
                var serviceProvider = contexto.GetInfrastructure<IServiceProvider>();
                var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
                loggerFactory.AddProvider(SqlLoggerProvider.Create());


                // ...
                var produtos = contexto.Produtos.ToList();
                foreach (var p in produtos)
                {
                    Console.WriteLine(p);
                }

                Console.WriteLine("=================");
                foreach (var e in contexto.ChangeTracker.Entries())
                {
                    Console.WriteLine(e);
                }

                var p1 = produtos.Last();
                p1.Nome = "007 - O Espiao Que Me ODIAVA";

                Console.WriteLine("=================");
                foreach (var e in contexto.ChangeTracker.Entries())
                {
                    Console.WriteLine(e);
                }

               contexto.SaveChanges();
            }
        }
    }
}
5 respostas

Olá Givanildo,

me manda o código da sua classe SqlLoggerProvider para eu dar uma olhada? Pode ser ela que não está fazendo o log acontecer.

Boa tarde Lucas , segue o código do SqlLoggerProvider :

using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.Logging;
using System;

namespace ConsoleApp1
{
    public class SqlLoggerProvider : ILoggerProvider
    {
        public static ILoggerProvider Create()
        {
            return new SqlLoggerProvider();
        }

        public ILogger CreateLogger(string categoryName)
        {
            if (categoryName == typeof(IRelationalCommandBuilderFactory).FullName)
            {
                return new SqlLogger();
            }
            return new NullLogger();
        }

        public void Dispose()
        {

        }
    }

    internal class NullLogger : ILogger
    {
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            //não faz nada
        }
    }

    public class SqlLogger : ILogger
    {
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            Console.WriteLine("");
            Console.WriteLine(formatter(state, exception));
            Console.WriteLine("");
        }
    }
}

Estranho, o código parece todo correto. Ele chega a acusar algum erro quando você executa este código? Ou ele pelo menos imprime no console o que foi passado nos Console.WriteLine do Main?

Um teste que você pode fazer é dentro do if

if (categoryName == typeof(IRelationalCommandBuilderFactory).FullName)
{
        return new SqlLogger();
}

adicionar um Console.WriteLine("Teste") para ver se ele está conseguindo criar o SqlLogger.

Uma possibilidade que acontece as vezes com o Visual Studio que é bizarro é que algumas vezes ele para de compilar o seu código. Você pode tentar de fechar e abrir o seu Visual Studio para ver se ele funciona.

Boa tarde Lucas, coloquei na classe SqlLoggerProvider o writeLine, porém ele não está entrando na condição do if, para entrar fiz um paleativo( if (categoryName == "Microsoft.EntityFrameworkCore.Query")), más gostaria que funcionasse conforme o exemplo do alura.

if (categoryName != typeof(IRelationalCommandBuilderFactory).FullName) { Console.WriteLine("Teste"); return new SqlLogger(); }

Eu notei uma coisa que talvez resolva, mas é um chute. Tenta trocar o namespace da classe SqlLoggerProvider para Alura.Loja.Testes.ConsoleApp .