2
respostas

Erro em pegar o pedidoId

O programa até roda, mas ao tentar levar um produto para o carrinho gera o seguinte erro: 'Sequence contains no elements'

namespace CasaDoCodigo
{
    public class DataService : IDataService
    {
        private readonly Contexto _contexto;
        private readonly IHttpContextAccessor _contextAccessor;

        public DataService(Contexto contexto, IHttpContextAccessor contextAccessor)
        {
            //vamos armazenar o contexto dentro de campo somente leitura
            this._contexto = contexto;
            this._contextAccessor = contextAccessor;
        }

        public void AddItemPedido(int produtoId)
        {
            var produto = _contexto.Produtos.Where(p => p.Id == produtoId).SingleOrDefault();

            if (produto != null)
            {
                int? pedidoId = GetSessionPedidoId();

                Pedido pedido = null;
                if (pedidoId.HasValue)
                {
                    pedido = _contexto.Pedidos.Where(p => p.Id == pedidoId.Value).SingleOrDefault();
                }

                if (!_contexto.ItensPedido.Where(i => i.Produto.Id == produtoId).Any())
                {
                    _contexto.ItensPedido.Add(new ItemPedido(pedido, produto, 1));
                    _contexto.SaveChanges();

                    SetSessionPedidoId(pedido);
                }
            }
        }

        private void SetSessionPedidoId(Pedido pedido)
        {
            _contextAccessor.HttpContext.Session.SetInt32("pedidoId", pedido.Id);
        }

        private int? GetSessionPedidoId()
        {
            return _contextAccessor.HttpContext.Session.GetInt32("pedidoId");
        }

        public List<ItemPedido> GetItensPedido()
        {
            var pedidoId = GetSessionPedidoId();
            var pedido = _contexto.Pedidos.Where(p => p.Id == pedidoId).Single();
            return this._contexto.ItensPedido.Where(i => i.Pedido.Id == pedido.Id).ToList();
        }

        public List<Produto> GetProdutos()
        {
            return this._contexto.Produtos.ToList();
        }

        public void InicializaDB()
        {
            this._contexto.Database.EnsureCreated();
            if (this._contexto.Produtos.Count() == 0)
            {
                List<Produto> produtos = new List<Produto>
                {
                  new Produto("Sleep not Found", 59.90m),
                  new Produto("May the code be with you", 59.90m),
                  new Produto("Rollback", 59.90m),
                  new Produto("REST", 69.90m),
                  new Produto("Design Patterns com Java", 69.90m),
                  new Produto("Vire o jogo com Spring Framework", 69.90m),
                  new Produto("Test-Driven Development", 69.90m),
                  new Produto("iOS: Programe para iPhone e iPad", 69.90m),
                  new Produto("Desenvolvimento de Jogos para Android", 69.90m)
                };

                foreach (var produto in produtos)
                {
                    this._contexto.Produtos.Add(produto);

                    //this._contexto.ItensPedido.Add(new ItemPedido(produto, 1));
                }

                this._contexto.SaveChanges();
            }
        }

        public UpdateItemPedidoResponse UpdateItemPedido(ItemPedido itemPedido)
        {
            var itemPedidoDB = _contexto.ItensPedido
                .Where(i => i.Id == itemPedido.Id)
                .SingleOrDefault();

            if(itemPedidoDB != null)
            {
                itemPedidoDB.AtualizaQuantidade(itemPedido.Quantidade);
                if(itemPedidoDB.Quantidade == 0)
                {
                    _contexto.ItensPedido.Remove(itemPedidoDB);
                }
                _contexto.SaveChanges();
            }

            var itensPedido = _contexto.ItensPedido.ToList();

            var carrinhoViewModel = new CarrinhoViewModel(itensPedido);

            return new UpdateItemPedidoResponse(itemPedidoDB, carrinhoViewModel);
        }
    }
}
2 respostas

Olá, Thiago

Aparentemente, seu banco de dados está inconsistente. Você pode fazer um teste para excluir o banco de dados e abrir novamente?

Vá ao menu View > SQL Server Object Explorer, abra a basta (localdb), abra a pasta Databases, e localize o banco "CasaDoCodigo". Clique com botão direito, "Excluir", marque "fechar todas as conexões existentes" e clique em ok. Rode a aplicação e tente novamente.

Agora apresentou o seguinte o erro: SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ItensPedido_Pedidos_PedidoId". The conflict occurred in database "CasaDoCodigo", table "dbo.Pedidos", column 'Id'. The statement has been terminated.