![]()  | 
    
     Hoje veremos como realizar um CRUD básico usando o micro ORM Dapper em uma aplicação Blazor.  | 
  
Se você esta chegando agora e não sabe o que é o Blazor leia o artigo ASP .NET Core - Iniciando com o Blazor - Macoratti; se você já conhece e quer saber mais pode fazer o curso de Blazor Essencial.
		
		
		![]()  | 
	
Hoje teremos uma aplicação bem simples que realiza o CRUD básico usando Dapper em um projeto Blazor Server.
Neste projeto iremos acessar o banco de dados CadastroDB criado no SQL Server usando o script:
| USE 
		[master] GO CREATE DATABASE [CadastroDB]; GO  | 
	
Também criamos a tabela Produtos usando o seguinte script SQL :
		USE [CadastroDB]
GO
		CREATE TABLE [dbo].[Produtos](
	[ProdutoId] [int] IDENTITY(1,1) NOT NULL,
	[Estoque] [int] NOT NULL,
	[Nome] [nvarchar](100) NOT NULL,
	[Preco] [decimal](18, 2) NOT NULL,
	[Descricao] [nvarchar](250) NULL,
	[Imagem] [nvarchar](250) NULL,
 CONSTRAINT [PK_Produtos] PRIMARY KEY CLUSTERED([ProdutoId] ASC);
GO
		 | 
	
A seguir temos a estrutura da tabela Produtos no SQL Server :
						
						
E os dados que incluimos na tabela para realizar os testes no projeto:
						
						
Recursos usados:
Criando o projeto Blazor no VS Community 2019
Abra o VS 2019 Community (versão mínima 16.5) e selecione a opção Create a New Project;
A seguir selecione a opção Blazor app e clique em next;
						
						
Informe o nome do projeto : Blazor_Produtos, a localização e clique em Create;
A seguir teremos uma janela com duas opções :
						
						
Selecione a primeira opção - Blazor Server App e clique em Create.
Ajustando o projeto criado
Será criado um projeto padrão que vamos ajustar da seguinte forma:
Na pasta wwwroot vamos criar a pasta images e nesta pasta vamos incluir as imagens que iremos usar em nosso projeto : basicloader.gif, notfound.jpg, loja.jpg e maco1b.jpg;
No arquivo App.razor vamos alterar o código para exibir a imagem notfound.jpg quando uma rota não for encontrada:
								<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <img src="/images/notfound.jpg" />
        </LayoutView>
    </NotFound>
</Router>
								 | 
							
O arquivo NavMenu é onde definimos os links para o menu da aplicação. Vamos alterar o conteúdo deste arquivo conforme abaixo:
		<div class="top-row pl-4 navbar navbar-dark">
    <a class="navbar-brand" href="">Blazor_CalculaIdade</a>
    <button class="navbar-toggler" @onclick="ToggleNavMenu">
        <span class="navbar-toggler-icon"></span>
    </button>
</div>
		<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <ul class="nav flex-column">
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
                <span class="oi oi-calculator" aria-hidden="true"></span>Home
            </NavLink>
        </li>
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="produtos">
                <span class="oi oi-book" aria-hidden="true"></span> Produtos
            </NavLink>
        </li>
    </ul>
</div>
...
		 | 
	
Alteramos os links do menu para exibir os links com os textos: Home e Produtos
Vamos agora incluir as referências ao Dapper e ao System.Data.SqlClient no projeto.
Podemos fazer isso usando o Gerenciador de pacotes do NuGet via menu Tools e na guia Browse selecionar o pacote e clicar no botão para instalar:
						
						
ou o Console do Gerenciador de Pacotes usando o comando Install-Package <nome_pacote>:
Install-Package System.Data.SqlClient -Version 4.8.1
						Criando a camada de acesso aos dados com Dapper
Vamos criar a camada de acesso a dados usando Dapper na pasta Data.
Para isso vamos criar a interface IDapperDAL definindo as operações básicas para obter, incluir, atualizar e executar procedimentos :
| 
								using 
								Dapper; using System.Collections.Generic; using System.Data; using System.Data.Common; 
								
								namespace 
								BlazorProdutos.Data  | 
							
Agora vamos criar a classe DapperDAL que implementa esta interface e define os métodos para realizar as operações de acesso ao banco de dados e realizar o CRUD:
| 
								using 
								Dapper; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; 
								
								namespace 
								BlazorProdutos.Data  | 
							
Note que fizemos uma implementação genérica que iremos usar quando criamos o serviço para os produtos.
Vamos criar a classe SqlConnectionConfiguration que vai retornar a string de conexão que iremos definir no arquivo appsettings.json :
| 
								public class
								SqlConnectionConfiguration { public SqlConnectionConfiguration(string value) => Value = value; public string Value { get; } }  | 
							
Criando o modelo de domínio e o serviço
Na pasta Data do projeto vamos criar a classe Produto que representa um produto:
								    public class Produto
    {
        public int ProdutoId { get; set; }
        public string Nome { get; set; }
        public string Descricao { get; set; }
        public string Imagem { get; set; }
        public decimal Preco { get; set; }
        public int Estoque { get; set; }
    }
								 | 
							
Agora vamos criar, na pasta Data, a interface IProdutoService onde vamos definir o contrato para gerenciar as informações do produto:
								using System.Collections.Generic;
using System.Threading.Tasks;
								namespace BlazorProdutos.Data
{
    public interface IProdutoService
    {
        Task<int> Create(Produto produto);
        Task<int> Delete(int Id);
        Task<int> Update(Produto produto);
        Task<Produto> GetById(int Id);
        Task<List<Produto>> ListAll();
    }
}
								 | 
							
A seguir vamos criar a classe ProdutoService que vai implementar esta interface e usar a nossa camada de acesso a dados para realizar as operações com o banco de dados SQL Server:
| 
								using 
								Dapper; using System.Collections.Generic; using System.Data; using System.Threading.Tasks; 
								
								namespace 
								BlazorProdutos.Data 
								      
								 public Task<int> 
								Create(Produto produto) 
								            
								var produtoId = 
								Task.FromResult(_dapperDal.Insert<int>("[dbo].[SP_Novo_Produto]", 
								            
								return produtoId; 
								            
								var updateProduto = 
								Task.FromResult(_dapperDal.Update<int>("[dbo].[SP_Atualiza_Produto]",  | 
							
Note que neste código estamos implementando a seleção, inclusão, exclusão e atualização de dados da seguinte forma:
Assim teremos que criar no banco de dados as stored procedures usadas.
1- Código para criar a stored Procedure SP_Novo_Produto
								Use CadastroDB
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE SP_Novo_Produto
    @Nome NVARCHAR(100),  
    @Descricao NVARCHAR(250),  
    @Imagem NVARCHAR(250),  
    @Preco Decimal(18,2),
    @Estoque INT
AS
BEGIN
	SET NOCOUNT ON;
	 INSERT INTO dbo.Produtos(Nome,Descricao,Imagem,Preco,Estoque)  
     VALUES (@Nome,@Descricao,@Imagem,@Preco,@Estoque)         
END
GO
								 | 
							
2- Código para criar a stored Procedure SP_Atualiza_Produto
| 
								Use 
								CadastroDB SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE SP_Atualiza_Produto @ProdutoId INT, @Nome NVARCHAR(100), @Descricao NVARCHAR(250), @Imagem NVARCHAR(250), @Preco Decimal(18,2), @Estoque INT AS BEGIN UPDATE dbo.Produtos SET Nome = @Nome, Descricao = @Descricao, Imagem = @Imagem, Preco = @Preco, Estoque = @Estoque Where ProdutoId = @ProdutoId END GO  | 
							
Abaixo vemos o banco de dados e a tabela Produtos e os procedimentos armazenados criados:
						
						
Registrando os serviços e definindo a string de conexão
Precisamos agora registrar os serviços criados no método ConfigureServices da classe Startup:
| 
								public void 
								ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); 
								
								        
								   
								services.AddScoped<IDapperDAL, DapperDAL>(); 
								     
								      
								var sqlConnectionConfiguration = new 
								SqlConnectionConfiguration(Configuration.GetConnectionString("SqlDbContext")); }  | 
							
Finalmente vamos definir a string de conexão com o banco de dados no arquivo appsettings.json :
								{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=Macoratti;Initial Catalog=CadastroDB;Integrated Security=True"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
								 | 
							
Atenção essa string de conexão é usada no meu ambiente. A sua string vai ser diferente.
Na segunda parte do artigo iremos criar os componentes para gerenciar e exibir as informações dos produtos.
						
						"Quem tem o Filho tem a vida; quem não tem o Filho de 
						Deus não tem a vida."
						
						
						1 João 5:12
ASP .NET Core - Criando uma aplicação com Angular 2 - Macoratti.net
ASP .NET Core - Criando uma aplicação Web no ... - Macoratti.net
ASP .NET Core - Iniciando com o Blazor - Macoratti
ASP .NET Core - CRUD usando Blazor e Entity ... - Macoratti
Blazor - O novo framework SPA da Microsoft - Macoratti.net
Visual Studio Code - Suporte ao desenvolvimento Blazor