Faactory.DbContext.SqlClient 0.6.0-preview-1

This is a prerelease version of Faactory.DbContext.SqlClient.
There is a newer version of this package available.
See the version list below for details.
dotnet add package Faactory.DbContext.SqlClient --version 0.6.0-preview-1
NuGet\Install-Package Faactory.DbContext.SqlClient -Version 0.6.0-preview-1
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="Faactory.DbContext.SqlClient" Version="0.6.0-preview-1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Faactory.DbContext.SqlClient --version 0.6.0-preview-1
#r "nuget: Faactory.DbContext.SqlClient, 0.6.0-preview-1"
#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.
// Install Faactory.DbContext.SqlClient as a Cake Addin
#addin nuget:?package=Faactory.DbContext.SqlClient&version=0.6.0-preview-1&prerelease

// Install Faactory.DbContext.SqlClient as a Cake Tool
#tool nuget:?package=Faactory.DbContext.SqlClient&version=0.6.0-preview-1&prerelease

ADO.NET Extensions

This project contains a set of extensions to help with managing multiple data sources, more specifically, inside a DI scenario.

Getting started

Before we can use the extensions, we need to register the context provider with our DI container. We'll have to install the appropriate package, depending on the provider we want to use; the following are currently supported

Provider Package Description
PostgreSql Faactory.DbContext.Npgsql PostgreSQL driver; uses Npgsql
SqlServer Faactory.DbContext.SqlClient SQL Server driver; uses Microsoft.Data.SqlClient
SqlServer Faactory.DbContext.RestSql SQL Server via restsql; still experimental

We'll use SqlServer as an example

$ dotnet add package Faactory.DbContext.SqlClient

We'll then register the provider and configure our databases; we can add as many contexts as we need.

IServiceCollection services = ...

services.AddSqlDbContextProvider()
    .AddDbContext( "my-db", "connection_string" )
    .AddDbContext( "my-other-db", "connection_string" );

Wherever we need to get access to our database context, we'll use the injected IDbContextFactory instance to retrieve an IDbContext instance.

public class Example
{
    private readonly IDbContext mydb;

    public Example( IDbContextFactory dbContextFactory )
    {
        mydb = dbContextFactory.GetDbContext( "my-db" );
    }

    // ...
}

When we require a new connection, we'll use the IDbContext instance to construct it.

public class Example
{
    private readonly IDbContext mydb;

    // ...

    public async Task DoSomethingAsync()
    {
        using ( var connection = mydb.GetDbConnection() )
        {
            await connection.OpenAsync();

            // ...
        }
    }
}

We can also construct the connection and open it directly

public async Task DoSomethingAsync()
{
    using ( var connection = await mydb.OpenAsync() )
    {
        // ...
    }
}

From this point forward, we'll have a DbConnection instance ready to use. Please note that all DbConnection instances should be properly disposed after use. Most of the ADO implementations will pool connections and not properly disposing them can lead to exceeding the number of open connections (connection leaks).

Notice: Starting with version 0.6, the library has switched to use the DbConnection class instead of the IDbConnection interface. This was done mostly because the interface doesn't expose the async methods. Since DbConnection should be the base class for most (if not all) ADO.NET providers, this transition shouldn't cause any braking changes. Nonetheless, if you're using the IDbConnection interface, you'll have to update your code to use the DbConnection class instead.

Transactions

As an alternative to the DbConnection.BeginTransaction[Async] methods, there are extensions available to shorten the amount of code written. The UseTransaction[Async] methods take care of opening/reusing a connection, creating a transaction and gracefully disposing of it all when finished.

public async Task DoSomethingAsync()
{
    await mydb.UseTransactionAsync( async t =>
    {
        var sqlCommand = t.Connection.CreateCommand();

        // ...

        await t.CommitAsync();
    } );
}

If an exception is thrown, the transaction is automatically rolled back. We can also provide additional behaviour to when this happens.

public async Task DoSomethingAsync()
{
    await mydb.UseTransactionAsync( async t =>
    {
        var sqlCommand = t.Connection.CreateCommand();

        // ...

        await t.CommitAsync();
    }, ex =>
    {
        // handle exception
    } );
}
Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  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 is compatible.  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. 
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
0.7.0 67 5/31/2024
0.6.1 99 3/8/2024
0.6.0 252 10/23/2023
0.6.0-preview-1 61 9/27/2023
0.5.2-preview-2 88 9/26/2023
0.5.2-preview-1 80 9/25/2023
0.5.1 149 7/7/2023
0.5.0 166 4/27/2023
0.4.0 426 8/9/2022
0.3.5 407 3/23/2022
0.3.4 396 3/18/2022
0.3.3 412 3/18/2022
0.3.2 414 3/18/2022
0.3.1 401 3/18/2022
0.3.0 387 3/17/2022
0.2.2 401 3/16/2022
0.2.1 275 10/4/2021
0.1.0 316 9/29/2021