3
respostas

Não aparece o código SQL no console.???????

O código está igualzinho ao da aula, o programa funciona, mas o código SQL não aparece na tela. Por que? Segue código das dias classes principais:

Class PROGRAM:

using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Loja
{
    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);
                }
            }
        }
    }
}

Class SQLLOGGERPROVIDER:

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

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

        public ILogger CreateLogger(string categoryName)
        {
            if (categoryName == typeof(IRelationalCommandBuilderFactory).FullName)
            {
                return new SqlLogger();
            }
            else 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("");
            }
        }
    }
}
3 respostas

Olá, Sérgio

Conferi aqui e realmente seu código está igual ao da aula. Execute o programa e abra a janela do Output do Visual Studio (menu View > Output) para conferir, pois a aplicação pode estar direcionando os comandos SQL para lá.

Testei novamente. Não está indo para a janela Output. Recriei toda a solução e continua do mesmo jeito. No Curso Entity Framework Core parte 1: Mapeando um banco pré-existente, a solução funciona apresentando os comandos SQL no console. Mas neste último curso é utilizado uma maneira diferente de apresentar. O que pode estar acontecendo ?

O código fornecido pela Alura está incorreto, por isso nada aparece. O código correto das procedure CreateLogger é

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

Reparem o sinal != do if.