Olá. Ao tentar executar o código do exemplo da aula 03, ocorreu um erro na linha
loggerFactory.AddProvider(SqlLoggerProvider.Create());
A mensagem é: "ILogProvider" não contém uma definição para AddProvider
Eu copiei o exemplo da explicação da aula.
Olá. Ao tentar executar o código do exemplo da aula 03, ocorreu um erro na linha
loggerFactory.AddProvider(SqlLoggerProvider.Create());
A mensagem é: "ILogProvider" não contém uma definição para AddProvider
Eu copiei o exemplo da explicação da aula.
Olá Luiz,
manda o código completo da sua classe Program e da SqlLoggerProvider para eu dar uma olhada, inclusive com os usings que pode ter faltado importar alguma coisa também.
Boa tarde Lucas. Obrigado pela ajuda.
Segue o código da classe Program:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Alura.Loja.Testes.ConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (var contexto = new LojaContext()) {
var produtos = contexto.Produtos.ToList();
var serviceProvider = contexto.GetInfrastructure<IServiceProvider>();
var loggerFactory = serviceProvider.GetService<ILoggerProvider>();
loggerFactory.AddProvider(SqlLoggerProvider.Create());
foreach (var item in produtos) {
Console.WriteLine(item);
}
Console.WriteLine("=================");
foreach (var e in contexto.ChangeTracker.Entries()) {
Console.WriteLine(e.State);
}
var p1 = produtos.First();
p1.Nome = "Harry Potter - Editado";
Console.WriteLine("=================");
foreach (var e in contexto.ChangeTracker.Entries()) {
Console.WriteLine(e.State);
}
contexto.SaveChanges();
Console.WriteLine("=================");
produtos = contexto.Produtos.ToList();
foreach (var p in produtos) {
Console.WriteLine(p);
}
}
}
}
}
Classe SqlLoggerProvider:
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Extensions.Logging;
using System;
namespace Alura.Loja.Testes.ConsoleApp {
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("");
}
}
}
Olá Luiz,
na linha em que está escrito
var loggerFactory = serviceProvider.GetService<ILoggerProvider>();
na verdade deveria ser ILoggerFactory ao invés de ILoggerProvider.
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
Boa tarde Lucas
A alteração funcionou. Obrigado.
Mas gostaria de avisar que há pequenos erros no código desse curso. Por exemplo:
Código da transcrição(não funciona):
private static void ExibeEntries(IEnumerable<EntityEntry> entries)
{
Console.WriteLine("===================");
foreach (var e in contexto.ChangeTracker.Entries())
{
Console.WriteLine(e);
}
}
Código que está no vídeo (digitado pelo instrutor):
private static void ExibeEntries(IEnumerable<EntityEntry> entries) {
Console.WriteLine("===================");
foreach (var e in entries) {
Console.WriteLine(e.Entity.ToString() + " - " + e.State);
}
}
Abraços Luiz
Eu acabei arrumando lá no texto o código, de fato estava errado. Obrigado pelo feedback =]