.NET 8 + Dapper em 4 exemplos: relacionamentos 1:1 e 1:n, monitoramento, performance
Recentemente realizei uma apresentação (16/04) sobre o uso do Dapper como solução de acesso a dados em projetos .NET. Procurando fugir do que comumente é apresentado sobre este Micro-ORM em conteúdos na Internet, separei em um repositório no GitHub 4 exemplos (além de um quinto projeto trazendo uma solução alternativa para cargas de dados):
Para acessar este repositório utilize o link:
https://github.com/renatogroffe/DotNet8-Dapper
Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!
A seguir temos uma descrição breve de cada um desses 5 projetos:
- one-to-one: API REST demonstrando a implementação de relacionamentos 1:1 (Estado x Região) e que faz uso de uma base de dados do SQLite;
- one-to-many-miniprofiler: API que implementa relacionamentos 1:n (Região x Estado) via biblioteca Slapper.AutoMapper, utilizando ainda uma base do SQL Server, Entity Framework Core e instrumentação/monitoramento com MiniProfiler;
- sqlserver-benchmarking: testes comparativos implementados com a biblioteca BenchmarkDotNet, a fim de analisar a performance no acesso a dados de bases SQL Server com Dapper, Dapper.Contrib (extensão que simplifica a implementação de CRUD com Dapper), Entity Framework Core e ADO.NET. Inclui um pipeline do Azure DevOps para execução automatizada desses testes;
- postgres-benchmarking: projeto que é uma variação da implementação empregando o BenchmarkDotNet em sqlserver-benchmarking, comparando aqui a performance na utilização de PostgreSQL com ADO.NET, Dapper e Entity Framework Core;
- bulkcopy-linqtodb: Console App criada em .NET 8 e que faz uso de SQL Server, da biblioteca Bogus (geração de dados fake) e do projeto LinqToDB para carga de dados de empresas. O suporte a Bulk Copy do LinqToDB é uma alternativa à inexistência de uma solução oficial para este tipo de implementação com Dapper.
Nos prints a seguir temos um exemplo de uso do MiniProfiler no projeto sqlserver-benchmarking, com as instruções SQL geradas a partir do uso do Dapper:
Quanto à utilização do BenchmarkDotNet, nos print seguintes temos resultados ao executar o pipeline que está em sqlserver-benchmarking e empregando o SQL Server (com ADO.NET, Dapper, Dapper.Contrib e Entity Framework Core):
Já os próximos prints trazem resultados similares com o PostgreSQL:
As variações nestes resultados aconteceram com base no número de registros-filhos gerados em cada bateria de testes (inclusão de Empresas + Contatos). Para entender melhor cada cenário, assim como todo o esforço de implementação, sugiro que você assista à gravação de uma live que realizamos recentemente no Canal .NET (clique neste link para acessar o vídeo no YouTube):
Referências
ASP.NET Core + Dapper + MiniProfiler: logging de instruções SQL sem complicações
MiniProfiler + Dapper + Entity Framework: logando instruções SQL em um projeto ASP.NET Core
Performance de código em .NET: implementando testes com BenchmarkDotNet
Testes de performance em .NET: um exemplo comparando Entity Framework e Dapper