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

Problema na compilação do projeto - The name SqlLoggerProvider does not exist in the current context ( SqlLoggerProvider.Create())

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


namespace Alura.Loja.Testes.ConsoleApp
{
    class Program
    {
       static void Main (string [] args)
    {
        var promocaoDePascoa = new Promocao();
        promocaoDePascoa.Descricao = "Páscoa Feliz";
        promocaoDePascoa.DataInicio = DateTime.Now;
        promocaoDePascoa.DataTermino = DateTime.Now.AddMonths(3);
        promocaoDePascoa.Produtos.Add(new Produto());
        promocaoDePascoa.Produtos.Add(new Produto());
        promocaoDePascoa.Produtos.Add(new Produto());

        using(var contexto = new LojaContext())
        {
            var serviceProvider = contexto.GetInfraestructure<IServiceProvider>();
            var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
            loggerFactory.AddProvider(SqlLoggerProvider.Create());

        }

    }
        private static void ExibeEntries(IEnumerable<EntityEntry> entries)
        {
            foreach (var e in entries)
            {
                Console.WriteLine(e.Entity.ToString() + " - " + e.State);
            }
        }
    }
}
7 respostas

Olá Jeremias,

parece que faltou importar o namespace da classe SqlLoggerProvider entre os seus using. Deixe o cursor em cima do SqlLoggerProvider quando você faz o SqlLoggerProvider.Create(), aperte o atalho Ctrl + . e veja se aparece a opção para você importar o namespace desta classe.

Olá,

eu já havia feito este procedimento porém várias opções são apresentadas más não aparece a opção para inserir a namespace referente a esta classe.

Me manda o código completo da sua classe SqlLoggerProvider para eu dar uma olhada.

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

namespace Alura.Loja.Testes.ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var promocaoDePascoa = new Promocao();
            promocaoDePascoa.Descricao = "Páscoa Feliz";
            promocaoDePascoa.DataInicio = DateTime.Now;
            promocaoDePascoa.DataTermino = DateTime.Now.AddMonths(3); // Periodo da data atual até 3 meses

            //promocaoDePascoa.Produtos.Add(new Produto());
            //promocaoDePascoa.Produtos.Add(new Produto());
            //promocaoDePascoa.Produtos.Add(new Produto());

            using (var contexto = new LojaContext())
            {
                var serviceProvider = contexto.GetInfrastructure<IServiceProvider>();
                var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
                loggerFactory.AddProvider(SqlLoggerProvider.Create());
            }
        }

        private static void ExibeEntries(IEnumerable<EntityEntry> entries)
        {
            foreach (var e in entries)
            {
                Console.WriteLine(e.Entity.ToString() + " - " + e.State);
            }
        }
    }
}    

// Classe Promocao
using System;
using System.Collections.Generic;

namespace Alura.Loja.Testes.ConsoleApp
{
    public class Promocao
    {
        public int Id { get; set; }
        public string Descricao { get; internal set; }
        public DateTime DataInicio { get; internal set; }
        public DateTime DataTermino { get; internal set; }
        public IList<PromocaoProduto> Produtos { get; internal set; }
    }
}

// Classe Produto 
using System.Collections.Generic;

namespace Alura.Loja.Testes.ConsoleApp
{
    public class Produto
    {
        public int Id { get; internal set; }
        public string Nome { get; internal set; }
        public string Categoria { get; internal set; }
        public double PrecoUnitario { get; internal set; }
        public string Unidade { get; set; }
        public IList<PromocaoProduto> Promocoes { get; set; }

        public override string ToString()
        {
            return $"Produto: {this.Id}, {this.Nome}, {this.Categoria}, {this.PrecoUnitario} ";
        }
    }
}

//Classe LojaContext
using Microsoft.EntityFrameworkCore;
using System;

namespace Alura.Loja.Testes.ConsoleApp
{
    /// Primeiramente faremos com que a classe permita usar a API do Entity dentro dela.
    /// Para que isso aconteça, faremos a classe herdar de DbContext.(nameSpace = Microsoft.EntityFrameworkCore)
    class LojaContext : DbContext
    {
        public DbSet<Produto> Produtos { get; set; }
        public DbSet<Compra> Compras { get; set; }
        public DbSet<Promocao> Promocoes { get; set; }
        public LojaContext()
        {

        }

        /// Definindo qual é o banco e qual é o endereço. 
        /// Sobrescrevendo o método OnConfiguring() da classe DbContext.
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            /// Esse método tem como argumento de entrada, um construtor de opções. 
            /// Usando o optionsBuilder chamaremos o método UseSqlServer(), passando 
            /// como argumento o endereço do banco que usamos no ProdutoDAO
            optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=LojaDB;Trusted_Connection=true;");
        }
    }
}

// Classe IProdutoDAO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alura.Loja.Testes.ConsoleApp
{
    interface IProdutoDAO
    {
        void Adicionar(Produto p);
        void Atualizar(Produto p);
        void Remover(Produto p);
        IList<Produto> Produtos();

    }
}

//Classe Compra
namespace Alura.Loja.Testes.ConsoleApp
{
    internal class Compra
    {
        public int Id { get; set; }
        public int Quantidade { get; internal set; }
        public Produto Produto { get; internal set; }
        public int ProdutoId { get; set; }
        public double Preco { get; internal set; }
        public Compra()
        {

        }
    }
}

Restante das classes:

// Classe ProdutoDAOEntity

using System;
using System.Collections.Generic;
using System.Linq;

namespace Alura.Loja.Testes.ConsoleApp
{
    class ProdutoDAOEntity : IProdutoDAO, IDisposable
    {
        private LojaContext contexto;

        public ProdutoDAOEntity()
        {
            this.contexto = new LojaContext();
        }

        public void Adicionar(Produto p)
        {
            contexto.Produtos.Add(p);
            contexto.SaveChanges();
        }

        public void Atualizar(Produto p)
        {
            contexto.Produtos.Update(p);
            contexto.SaveChanges();
        }

        public void Remover(Produto p)
        {
            contexto.Produtos.Remove(p);
            contexto.SaveChanges();
        }
        public IList<Produto> Produtos()
        {
            return contexto.Produtos.ToList();
        }

        public void Dispose()
        {
            contexto.Dispose();
        }
    }
}

// Classe Produto Promocao
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Alura.Loja.Testes.ConsoleApp
{
    // Esta classe conterá o relacionamento entre as tabelas Produto/Compra
    public class PromocaoProduto
    {
        public int ProdutoId { get; set; }
        public Produto Produto { get; set; }
        public int PromocaoId { get; set; }
        public Promocao Promocao { get; set }
    }
}
solução!

Mas está faltando a classe SqlLoggerProvider criada na aula 3. Chegou a fazer ela?

É isso mesmo Lucas, estava faltando a implementação desta classe. Obrigado!