Marraia.MySql 3.0.0

dotnet add package Marraia.MySql --version 3.0.0
                    
NuGet\Install-Package Marraia.MySql -Version 3.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Marraia.MySql" Version="3.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Marraia.MySql" Version="3.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Marraia.MySql" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Marraia.MySql --version 3.0.0
                    
#r "nuget: Marraia.MySql, 3.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Marraia.MySql@3.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Marraia.MySql&version=3.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Marraia.MySql&version=3.0.0
                    
Install as a Cake Tool

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 IReadDbConnection e IWriteDbConnection para 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 using pattern)
  • 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 IDbConnectionFactory para gerenciar criação de conexões
  • ✅ Atualizado AddMySql() para registrar factory em vez de conexões Scoped/Singleton
  • ✅ Refatorado RepositoryStandard para criar/descartar conexões por operação
  • ✅ Refatorado RepositoryBase e RepositoryCommon com mesmo padrão
  • ✅ Atualizado UnitOfWork para 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 OpenAsync e DisposeAsync
  • ⚠️ AddMySqlSingleton marcado como obsoleto
  • ⚠️ Breaking: Construtores de repositórios agora esperam IDbConnectionFactory em vez de IDbConnection

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 IReadDbConnection e IWriteDbConnection para injeção e escalabilidade.
  • Adicionada a opção AddMySqlSingleton para registrar serviços como singleton quando desejado.
  • Registrado MySqlGuidTypeHandler e removidos mapas de tipo para Guid/Guid? no Dapper para evitar conflitos.
  • Melhor gerenciamento de conexões, evitando DataReader abertos.

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
Loading failed

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.