Baixe o app para aproveitar ainda mais
Prévia do material em texto
Treinamento em C# WebDeveloper Aula 20 Segunda-feira, 17 de Dezembro de 2018 Acesso a banco de dados com EntityFramework. Desenvolvimento com Asp.Net WebApi virtual Permite que um método seja sobrescrito pelas subclasses que herdarem a classe principal. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Projeto.Repository.Context; //importando.. using System.Data.Entity; //importando.. namespace Projeto.Repository.Persistence { public class BaseRepository<T> where T : class { public virtual void Inserir(T obj) { using (DataContext ctx = new DataContext()) { ctx.Entry(obj).State = EntityState.Added; //insert ctx.SaveChanges(); //executando.. } } public virtual void Atualizar(T obj) { using (DataContext ctx = new DataContext()) { ctx.Entry(obj).State = EntityState.Modified; //update ctx.SaveChanges(); //executando.. } } public virtual void Excluir(T obj) { using (DataContext ctx = new DataContext()) { ctx.Entry(obj).State = EntityState.Deleted; //delete ctx.SaveChanges(); //executando.. } } public virtual List<T> Consultar() { using (DataContext ctx = new DataContext()) { return ctx.Set<T>().ToList(); } } public virtual T ConsultarPorId(int id) { using (DataContext ctx = new DataContext()) { return ctx.Set<T>().Find(id); } } } } Realizando uma sobrescrita do método "Consultar()" na classe ProdutoRepository using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity; using Projeto.Entities; using Projeto.Repository.Context; namespace Projeto.Repository.Persistence { public class ProdutoRepository : BaseRepository<Produto> { //sobrescrita do método Consultar() public override List<Produto> Consultar() { using (DataContext ctx = new DataContext()) { return ctx.Produto .Include(p => p.Estoque) //JOIN.. .ToList(); } } } } Realizando uma sobrescrita do método "ConsultarPorId()" na classe ProdutoRepository using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity; using Projeto.Entities; using Projeto.Repository.Context; namespace Projeto.Repository.Persistence { public class ProdutoRepository : BaseRepository<Produto> { //sobrescrita do método Consultar() public override List<Produto> Consultar() { using (DataContext ctx = new DataContext()) { return ctx.Produto .Include(p => p.Estoque) //JOIN.. .ToList(); } } //sobrescrita do método ConsultarPorId() public override Produto ConsultarPorId(int id) { using (DataContext ctx = new DataContext()) { return ctx.Produto .Include(p => p.Estoque) //JOIN .FirstOrDefault(p => p.IdProduto == id); } } } } Modificando a classe de modelo de consulta de produtos: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Projeto.Presentation.Models { public class ProdutoConsultaModel { public int IdProduto { get; set; } public string Nome { get; set; } public decimal Preco { get; set; } public int Quantidade { get; set; } public int IdEstoque { get; set; } //Relacionamento.. public EstoqueConsultaModel Estoque { get; set; } } } /ProdutoController.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using Projeto.Presentation.Models; using Projeto.Business; using Projeto.Entities; using Projeto.Presentation.Utils; namespace Projeto.Presentation.Controllers { [RoutePrefix("api/produto")] public class ProdutoController : ApiController { [HttpPost] //verbo HTTP POST [Route("cadastrar")] //ENDPOINT -> /api/produto/cadastrar public HttpResponseMessage Cadastrar(ProdutoCadastroModel model) { //verificar se os dados da model passaram nas validações if (ModelState.IsValid) { try { Produto produto = new Produto(); produto.Nome = model.Nome; produto.Preco = model.Preco; produto.Quantidade = model.Quantidade; produto.IdEstoque = model.IdEstoque; ProdutoBusiness business = new ProdutoBusiness(); business.Cadastrar(produto); return Request.CreateResponse(HttpStatusCode.OK, "Produto cadastrado com sucesso."); } catch (Exception e) { return Request.CreateResponse (HttpStatusCode.InternalServerError, "Erro: " + e.Message); } } else { var erros = ValidationUtil.ObterErros(ModelState); return Request.CreateResponse(HttpStatusCode.BadRequest, erros); } } [HttpPut] //verbo HTTP PUT [Route("atualizar")] //ENDPOINT -> /api/produto/atualizar public HttpResponseMessage Atualizar(ProdutoEdicaoModel model) { //verificar se os dados da model passaram nas validações if (ModelState.IsValid) { try { Produto produto = new Produto(); produto.IdProduto = model.IdProduto; produto.Nome = model.Nome; produto.Preco = model.Preco; produto.Quantidade = model.Quantidade; produto.IdEstoque = model.IdEstoque; ProdutoBusiness business = new ProdutoBusiness(); business.Atualizar(produto); return Request.CreateResponse(HttpStatusCode.OK, "Produto atualizado com sucesso."); } catch (Exception e) { return Request.CreateResponse (HttpStatusCode.InternalServerError, "Erro: " + e.Message); } } else { var erros = ValidationUtil.ObterErros(ModelState); return Request.CreateResponse(HttpStatusCode.BadRequest, erros); } } [HttpDelete] //verbo HTTP DELETE [Route("excluir")] //ENDPOINT -> /api/produto/excluir public HttpResponseMessage Excluir(int id) { try { ProdutoBusiness business = new ProdutoBusiness(); Produto produto = business.ConsultarPorId(id); //excluindo.. business.Excluir(produto); return Request.CreateResponse(HttpStatusCode.OK, "Produto excluido com sucesso."); } catch (Exception e) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Erro: " + e.Message);} } [HttpGet] [Route("consultar")] public HttpResponseMessage Consultar() { try { ProdutoBusiness business = new ProdutoBusiness(); //declarando uma lista da model.. List<ProdutoConsultaModel> lista = new List<ProdutoConsultaModel>(); //varrer os estoques obtidos da base foreach (Produto produto in business.Consultar()) { ProdutoConsultaModel model = new ProdutoConsultaModel(); model.Estoque = new EstoqueConsultaModel(); model.IdProduto = produto.IdProduto; model.Nome = produto.Nome; model.Preco = produto.Preco; model.Quantidade = produto.Quantidade; model.IdEstoque = produto.IdEstoque; model.Estoque.IdEstoque = produto.Estoque.IdEstoque; model.Estoque.Nome = produto.Estoque.Nome; lista.Add(model); //adicionar na lista } return Request.CreateResponse(HttpStatusCode.OK, lista); } catch (Exception e) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Erro: " + e.Message); } } [HttpGet] [Route("consultarporid")] public HttpResponseMessage ConsultarPorId(int id) { try { ProdutoBusiness business = new ProdutoBusiness(); Produto produto = business.ConsultarPorId(id); ProdutoConsultaModel model = new ProdutoConsultaModel(); model.Estoque = new EstoqueConsultaModel(); model.IdProduto = produto.IdProduto; model.Nome = produto.Nome; model.Preco = produto.Preco; model.Quantidade = produto.Quantidade; model.IdEstoque = produto.IdEstoque; model.Estoque.IdEstoque = produto.Estoque.IdEstoque; model.Estoque.Nome = produto.Estoque.Nome; return Request.CreateResponse(HttpStatusCode.OK, model); } catch (Exception e) { return Request.CreateResponse(HttpStatusCode.InternalServerError, "Erro: " + e.Message); } } } } Executando: Voltando para o frontend Angular: <!DOCTYPE html> <html ng-app="appProduto"> <head> <meta charset="utf-8" /> <title></title> <link href="../../Content/bootstrap.min.css" rel="stylesheet" /> </head> <body class="container"> <div id="carregamento" class="text-center"> <img src="https://upload.wikimedia.org/wikipedia/commons/b/b1/Loading_icon.gif"/> </div> <div id="conteudo" style="display: none;"> <h2>Consulta de Produtos</h2> <a href="/index.html">Página inicial</a> <hr /> <div ng-controller="produtoConsulta"> <!-- INICIO --> <div class="row"> <div class="col-md-3"> <label>Filtrar Produtos:</label> <input type="text" class="form-control" placeholder="Digite aqui" ng-model="filtro" /> </div> <div class="col-md-3"> <label>Ordenar Registros:</label> <select class="form-control" ng-model="ordenacao"> <option value="">Selecione</option> <option value="IdProduto">Código</option> <option value="Nome">Nome do Produto</option> <option value="Preco">Preço</option> <option value="Quantidade">Quantidade</option> <option value="Estoque.Nome"> Nome do Estoque</option> </select> </div> </div> <!-- FIM --> <br /> <table class="table table-hover table-bordered" ng-init="consultar()"> <thead> <tr> <th>Código</th> <th>Nome do Produto</th> <th>Preço</th> <th>Quantidade</th> <th>Total</th> <th>Nome do Estoque</th> <th>Operações</th> </tr> </thead> <tbody> <tr ng-repeat="p in produtos | filter : filtro | orderBy : ordenacao"> <td>{{p.IdProduto}}</td> <td>{{p.Nome}}</td> <td>{{p.Preco | currency : 'R$'}}</td> <td>{{p.Quantidade}}</td> <td>{{(p.Preco * p.Quantidade) | currency : 'R$'}}</td> <td>{{p.Estoque.Nome}}</td> <td> <button class="btn btn-primary btn-sm" data-target="#janelaedicao" data-toggle="modal" ng-click="obter(p.IdProduto)"> Atualizar </button> <button class="btn btn-danger btn-sm" data-target="#janelaexclusao" data-toggle="modal" ng-click="obter(p.IdProduto)"> Excluir </button> </td> </tr> </tbody> <tfoot> <tr> <td colspan="7"> Quantidade de registros: {{(produtos | filter : filtro).length}} </td> </tr> </tfoot> </table> <!-- JANELA DE EDIÇÃO --> <div id="janelaedicao" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header bg-primary"> <h3 class="text-white">Atualizar Produto</h3> </div> <div class="modal-body"> <label>Código:</label> <input type="text" class="form-control" readonly="readonly" ng-model="produto.IdProduto" /> <br /> <label>Nome do Produto:</label> <input type="text" class="form-control" ng-model="produto.Nome" /> <br /> <label>Preço:</label> <input type="text" class="form-control" ng-model="produto.Preco" /> <br /> <label>Quantidade:</label> <input type="text" class="form-control" ng-model="produto.Quantidade" /> <br /> <label>Selecione o Estoque:</label> <select class="form-control" ng-model="produto.IdEstoque" ng-init="consultarEstoques()"> <option value="">Escolha uma opção</option> <option ng-repeat="e in estoques" value="{{e.IdEstoque}}" ng-selected="produto.IdEstoque == e.IdEstoque"> {{e.Nome}} </option></select> <br /> <div class="alert alert-primary" ng-show="mensagemEdicao"> {{mensagemEdicao}} </div> </div> <div class="modal-footer"> <button class="btn btn-info" data-dismiss="modal"> Fechar Janela </button> <button class="btn btn-primary" ng-click="atualizar()"> Atualizar Dados </button> </div> </div> </div> </div> <!-- FIM DA JANELA --> <!-- JANELA DE EXCLUSÂO --> <div id="janelaexclusao" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header bg-danger"> <h3 class="text-white">Excluir Produto</h3> </div> <div class="modal-body"> Deseja realmente excluir este produto? <hr /> Código: <strong>{{produto.IdProduto}}</strong> <br /> Nome do Produto: <strong>{{produto.Nome}}</strong> <br /> Preço: <strong>{{produto.Preco}}</strong> <br /> Quantidade: <strong>{{produto.Quantidade}}</strong> <br /> <br /> <div class="alert alert-danger" ng- show="mensagemExclusao"> {{mensagemExclusao}} </div> </div> <div class="modal-footer"> <button class="btn btn-info" data-dismiss="modal"> Fechar Janela </button> <button class="btn btn-danger" ng-click="excluir()"> Excluir Estoque </button> </div> </div> </div> </div> <!-- FIM DA JANELA --> </div> </div> <script src="../../Scripts/jquery-3.0.0.min.js"></script> <script src="../../Scripts/bootstrap.min.js"></script> <script src="../../Scripts/angular.min.js"></script> <script> $(document).ready(function () { setTimeout( function () { $("#carregamento").hide(); $("#conteudo").show(1000); }, 2000); }); </script> <script> var app = angular.module('appProduto', []); app.controller('produtoConsulta', function ($scope, $http) { //função para executar o serviço de consulta na API $scope.consultar = function () { //executar o serviço da API.. $http.get("http://localhost:51269/api/produto/consultar") .then(function (d) { //capturar o resultado (lista) $scope.produtos = d.data; //JSON ARRAY.. }) .catch(function (e) { console.log(e); }) }; //função para obter a consulta de estoques $scope.consultarEstoques = function () { $http.get("http://localhost:51269/api/estoque/consultar") .then(function (d) { $scope.estoques = d.data; }) .catch(function (e) { console.log(e); }); }; //função para buscar 1 produto pelo id.. $scope.obter = function (id) { $scope.mensagemEdicao = ""; $scope.mensagemExclusao = ""; $scope.produto = {}; //vazio.. //executar o serviço da API.. $http.get("http://localhost:51269/ api/produto/consultarporid?id=" + id) .then(function (d) { $scope.produto = d.data; }) .catch(function (e) { console.log(e); }); }; //função para atualizar os dados do produto.. $scope.atualizar = function () { //executar o serviço da API.. $http.put("http://localhost:51269 /api/produto/atualizar", $scope.produto) .then(function (d) { $scope.mensagemEdicao = d.data; $scope.consultar(); }) .catch(function (e) { console.log(e); }); }; //função para excluir o produto selecionado.. $scope.excluir = function () { //executar o serviço da API.. $http.delete("http://localhost:51269/ api/produto/excluir?id=" + $scope.produto.IdProduto) .then(function (d) { $scope.mensagemExclusao = d.data; $scope.consultar(); }) .catch(function (e) { console.log(e); }); }; }) </script> </body> </html> 14
Compartilhar