Marraia.MySql
3.0.0
dotnet add package Marraia.MySql --version 3.0.0
NuGet\Install-Package Marraia.MySql -Version 3.0.0
<PackageReference Include="Marraia.MySql" Version="3.0.0" />
<PackageVersion Include="Marraia.MySql" Version="3.0.0" />
<PackageReference Include="Marraia.MySql" />
paket add Marraia.MySql --version 3.0.0
#r "nuget: Marraia.MySql, 3.0.0"
#:package Marraia.MySql@3.0.0
#addin nuget:?package=Marraia.MySql&version=3.0.0
#tool nuget:?package=Marraia.MySql&version=3.0.0
Marraia.MySql
Biblioteca para auxiliar sua conexão com o MySQL de forma fácil, segura e escalável.
Compatível com Dapper, fornece integração simples com padrões de repositório, Unit of Work e transações.
🚀 Recursos principais
- ✅ Suporte a conexões separadas para leitura e escrita (read/write)
- ✅ Controle de paralelismo seguro com
SemaphoreSlim - ✅ Total compatibilidade retroativa com o modelo anterior (
IDbConnection) - ✅ Abstração via
IReadDbConnectioneIWriteDbConnectionpara injeção de dependência (modo read/write) - ✅ Gerenciamento automático de abertura/fechamento de conexões
🧩 Instalação
Via .NET CLI:
dotnet add package Marraia.MySql
Via Package Manager Console:
Install-Package Marraia.MySql
⚙️ Configuração no Startup / Program.cs
🔸 Modo recomendado (conexão por operação com factory)
// Registra factory para criar conexões por operação
// Este é o modo recomendado que evita problemas de descarte com MySql.Data 9.1.0+
services.AddMySql("Server=db;Database=MinhaBase;User=usuario;Password=senha;");
Vantagens:
- ✅ Sem problemas de descarte de conexões
- ✅ Melhor compatibilidade com MySql.Data 9.1.0+
- ✅ Connection pooling gerenciado pelo MySQL Connector
- ✅ Cada operação cria, usa e descarta sua própria conexão
🔹 Modo avançado (com leitura e escrita separadas)
services.AddMySql(
connectionStringRead: "Server=db-ro;Database=MinhaBase;User=usuario_ro;Password=senha_ro;",
connectionStringWrite: "Server=db-rw;Database=MinhaBase;User=usuario_rw;Password=senha_rw;"
);
⚠️ Modo singleton (obsoleto)
// Obsoleto - use AddMySql em vez disso
// Mantido apenas para compatibilidade com código legado
[Obsolete]
services.AddMySqlSingleton("Server=db;Database=MinhaBase;User=usuario;Password=senha;");
⚙️ Testes de integração 🧪
Requisitos:
- Docker rodando localmente
- .NET SDK 6.0
Para executar os testes de integração:
dotnet test ./Marraia.MySql.UnitTest
Se ocorrerem erros relacionados a versões de pacotes, assegure-se de usar as versões compatíveis com .NET 6 (o projeto de teste já está configurado com versões compatíveis).
🧱 Exemplo de uso em repositório
public class ClienteRepository : RepositoryStandard<Cliente, int>
{
// Construtor recomendado usando factory (conexão por operação)
public ClienteRepository(IDbConnectionFactory factory, ITransactionBase tx)
: base(factory, tx)
{
}
// Exemplo de leitura - conexão criada, usada e descartada automaticamente
public async Task<IEnumerable<Cliente>> ObterTodosAsync()
{
return await ExecuteSafeAsync(conn =>
conn.QueryAsync<Cliente>("SELECT * FROM Cliente"));
}
// Exemplo de escrita - conexão criada, usada e descartada automaticamente
public async Task<int> InserirAsync(Cliente cliente)
{
return await ExecuteSafeAsync(conn =>
conn.ExecuteAsync("INSERT INTO Cliente (Nome, Email) VALUES (@Nome, @Email)", cliente));
}
}
// Modo alternativo com conexões separadas (Read/Write)
public class ClienteRepositoryAdvanced : RepositoryStandard<Cliente, int>
{
public ClienteRepositoryAdvanced(IReadDbConnection read, IWriteDbConnection write, ITransactionBase tx)
: base(read, write, tx)
{
}
// Exemplo usando conexão de leitura
public async Task<IEnumerable<Cliente>> ObterTodosAsync()
{
return await ExecuteReadAsync(conn =>
conn.QueryAsync<Cliente>("SELECT * FROM Cliente"));
}
// Exemplo usando conexão de escrita
public async Task<int> InserirAsync(Cliente cliente)
{
return await ExecuteWriteAsync(conn =>
conn.ExecuteAsync("INSERT INTO Cliente (Nome, Email) VALUES (@Nome, @Email)", cliente));
}
}
💡 Sobre o RepositoryStandard
A classe base RepositoryStandard usa o padrão de conexão por operação:
| Modo | Tipo Injetado | Descrição |
|---|---|---|
| Recomendado | IDbConnectionFactory |
Usa factory para criar conexões por operação |
| Avançado | IReadDbConnection / IWriteDbConnection |
Separa conexões de leitura e escrita automaticamente |
Como funciona:
- Cada método (
ExecuteSafeAsync,ExecuteReadAsync,ExecuteWriteAsync) cria uma nova conexão - A conexão é aberta no início da operação
- A conexão é automaticamente descartada ao final da operação (usando
usingpattern) - O MySQL Connector gerencia o connection pooling automaticamente
Benefícios:
- ✅ Elimina erros de descarte com MySql.Data 9.1.0+
- ✅ Melhor isolamento entre operações
- ✅ Compatível com async/await
- ✅ Sem necessidade de implementar IDisposable nos repositórios
🧰 Exemplo de uso com UnitOfWork
using (var uow = _unitOfWork.BeginTransaction())
{
await _clienteRepository.InserirAsync(cliente);
await _pedidoRepository.InserirAsync(pedido);
uow.Commit();
}
🏗️ Compatibilidade
| Recurso | Versão mínima |
|---|---|
| .NET | 6.0 |
| C# | 8.0 ou superior |
| Dapper | 2.0+ |
| MySql.Data | 8.0+ |
🧾 Histórico de versões
v3.0.0 (Breaking Changes)
- 🎯 MUDANÇA PRINCIPAL: Migração para padrão de conexão por operação usando factory
- ✅ Criada interface
IDbConnectionFactorypara gerenciar criação de conexões - ✅ Atualizado
AddMySql()para registrar factory em vez de conexões Scoped/Singleton - ✅ Refatorado
RepositoryStandardpara criar/descartar conexões por operação - ✅ Refatorado
RepositoryBaseeRepositoryCommoncom mesmo padrão - ✅ Atualizado
UnitOfWorkpara usar factory e gerenciar ciclo de vida da conexão - ✅ Eliminados logs de erro de descarte com MySql.Data 9.1.0+
- ✅ Melhor compatibilidade com async/await usando
OpenAsynceDisposeAsync - ⚠️
AddMySqlSingletonmarcado como obsoleto - ⚠️ Breaking: Construtores de repositórios agora esperam
IDbConnectionFactoryem vez deIDbConnection
Motivo da mudança:
- MySql.Data 9.1.0 apresenta problemas ao descartar conexões gerenciadas pelo DI como Scoped/Singleton
- Padrão de conexão por operação é a recomendação oficial e elimina esses problemas
- Connection pooling continua funcionando normalmente (gerenciado pelo MySQL Connector)
Migração:
// ANTES (v2.x)
public class MeuRepository : RepositoryStandard<MinhaEntity, int>
{
public MeuRepository(IDbConnection connection, ITransactionBase tx)
: base(connection, tx) { }
}
// DEPOIS (v3.0)
public class MeuRepository : RepositoryStandard<MinhaEntity, int>
{
public MeuRepository(IDbConnectionFactory factory, ITransactionBase tx)
: base(factory, tx) { }
}
v2.0.0
- Adicionado suporte a conexões de leitura e escrita.
- Implementado controle de paralelismo seguro com
SemaphoreSlim. - Mantida compatibilidade total com o modo anterior (
IDbConnection). - Adicionada separação via
IReadDbConnectioneIWriteDbConnectionpara injeção e escalabilidade. - Adicionada a opção
AddMySqlSingletonpara registrar serviços como singleton quando desejado. - Registrado
MySqlGuidTypeHandlere removidos mapas de tipo paraGuid/Guid?no Dapper para evitar conflitos. - Melhor gerenciamento de conexões, evitando
DataReaderabertos.
v1.x
- Conexão única com
IDbConnection. - Suporte básico a Dapper e Unit of Work.
🧑💻 Contribuições
Contribuições são bem-vindas!
Abra um pull request ou relate problemas em GitHub Issues.
⚖️ Licença
Distribuído sob a licença MIT.
Consulte o arquivo LICENSE para mais informações.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Dapper (>= 2.1.35)
- Microsoft.Extensions.DependencyInjection (>= 9.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.0)
- MySql.Data (>= 9.1.0)
- System.Text.Json (>= 9.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.0.0 | 134 | 2/19/2026 |
| 1.0.26-prerelease | 84 | 2/19/2026 |
| 1.0.25-prerelease | 97 | 2/18/2026 |
| 1.0.24-prerelease | 119 | 2/18/2026 |
| 1.0.23-prerelease | 88 | 2/18/2026 |
| 1.0.22-beta | 106 | 2/13/2026 |
| 1.0.21-beta | 84 | 2/13/2026 |
| 1.0.20-beta | 100 | 2/13/2026 |
| 1.0.19-beta | 101 | 2/13/2026 |
| 1.0.18 | 151 | 2/11/2026 |
| 1.0.17 | 105 | 2/11/2026 |
| 1.0.16 | 163 | 2/10/2026 |
| 1.0.15-prerelease | 115 | 2/10/2026 |
| 1.0.14-prerelease | 576 | 12/23/2025 |
| 1.0.13-prerelease | 175 | 12/23/2025 |
| 1.0.12-prerelease | 179 | 12/23/2025 |
| 1.0.11-prerelease | 184 | 12/23/2025 |
| 1.0.10-prerelease | 655 | 11/11/2025 |
| 1.0.9 | 2,550 | 4/2/2025 |
| 1.0.8 | 1,204 | 12/17/2024 |
v3.0.0 (Breaking Changes):
• MIGRAÇÃO PARA PADRÃO DE CONEXÃO POR OPERAÇÃO usando factory.
• Criada IDbConnectionFactory para gerenciar criação de conexões.
• Eliminados logs de erro de descarte com MySql.Data 9.1.0+.
• Refatorados RepositoryStandard, RepositoryBase, RepositoryCommon e UnitOfWork.
• Melhor compatibilidade com async/await (OpenAsync, DisposeAsync).
• AddMySqlSingleton marcado como obsoleto.
• BREAKING: Construtores de repositórios agora esperam IDbConnectionFactory.
Versões anteriores:
• v1.0.25-prerelease: Removido SemaphoreSlim, código simplificado.
• v1.0.24: IAsyncDisposable, logs detalhados.