SolTechnology.Core.SQL
1.0.0
dotnet add package SolTechnology.Core.SQL --version 1.0.0
NuGet\Install-Package SolTechnology.Core.SQL -Version 1.0.0
<PackageReference Include="SolTechnology.Core.SQL" Version="1.0.0" />
<PackageVersion Include="SolTechnology.Core.SQL" Version="1.0.0" />
<PackageReference Include="SolTechnology.Core.SQL" />
paket add SolTechnology.Core.SQL --version 1.0.0
#r "nuget: SolTechnology.Core.SQL, 1.0.0"
#:package SolTechnology.Core.SQL@1.0.0
#addin nuget:?package=SolTechnology.Core.SQL&version=1.0.0
#tool nuget:?package=SolTechnology.Core.SQL&version=1.0.0
Overview
The SolTechnology.Core.SQL library provides minimum functionality needed for SQL db connection. It handles needed services registration and configuration and a result provides IDbConnection.
Registration
For installing the library, reference SolTechnology.Core.SQL nuget package and invoke AddSQL() service collection extension method:
services.AddSQL();
Configuration
- The first option is to create an appsettings.json section:
"Configuration": {
"Sql": {
"ConnectionString": "Data Source=localhost,1401;Database=TaleCodeDatabase; User ID=SA;Password=password_xxddd_2137;Persist Security Info=True;MultipleActiveResultSets=True;Trusted_Connection=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True"
}
}
- Alternatevely the same settings can be provided by optional parameter during registration:
var sqlConfiguration = new SQLConfiguration
{
ConnectionString = "Data Source=localhost,1401;Database=TaleCodeDatabase; User ID=SA;Password=password_xxddd_2137;Persist Security Info=True;MultipleActiveResultSets=True;Trusted_Connection=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True"
};
services.AddSQL(sqlConfiguration);
Usage
- Inject ISQLConnectionFactory
public MatchRepository(ISQLConnectionFactory sqlConnectionFactory)
{
_sqlConnectionFactory = sqlConnectionFactory;
}
- Create IDbConnection
using (var connection = _sqlConnectionFactory.CreateConnection())
- Works well with raw SQL and Dapper ORM.
Error Translation
SqlErrorTranslator maps SQL Server exceptions to typed Result failures — keeping SqlException from leaking into the application layer.
| SQL Error Code | Mapped Error Type | Recoverable |
|---|---|---|
| 2627, 2601 | ConflictError (duplicate key) |
No |
| 1205 | DeadlockError |
Yes |
| -2 | TimeoutError |
Yes |
| other | Error (generic) |
No |
Usage in repositories
public async Task<Result> Save(City city)
{
return await SqlErrorTranslator.Execute(async () =>
{
using var connection = _connectionFactory.CreateConnection();
await connection.ExecuteAsync("INSERT INTO Cities ...", city);
});
}
public async Task<Result<City>> GetById(int id)
{
return await SqlErrorTranslator.Execute(async () =>
{
using var connection = _connectionFactory.CreateConnection();
return await connection.QuerySingleAsync<City>("SELECT * FROM Cities WHERE Id = @id", new { id });
});
}
Repository Convention
- Repositories return
Result/Result<T>, never throw for expected outcomes (duplicates, timeouts, deadlocks). - Wrap database calls with
SqlErrorTranslator.Execute(...)to translate SQL errors. - Repositories return domain types, not EF entities or driver types.
- Methods are intent-named (
GetById,SaveTrip), not generic CRUD (Update,Save). - One repository per aggregate / bounded context.
--- Testing
The companion package SolTechnology.Core.SQL.Testing provides SQLFixture — a
Testcontainers-backed database fixture for component tests.
Reference it from test projects only.
It is ORM-agnostic (it only hands back a connection string, so Dapper and EF consumers are served identically) and supports both SQL Server (default) and PostgreSQL, with pluggable schema provisioning and Respawn-based reset:
// SQL Server + dacpac (default, source-compatible with the original in-Sql fixture)
var fixture = new SQLFixture("TaleCodeDatabase")
.WithSQLProject("../../../src/TaleCodeDatabase/TaleCodeDatabase.csproj");
await fixture.InitializeAsync();
var connectionString = fixture.DatabaseConnectionString; // wire into "Sql:ConnectionString"
// ... run tests ...
await fixture.ResetAsync(); // between-test reset (Respawn; schema preserved)
await fixture.DisposeAsync(); // no-op when TESTCONTAINERS_REUSE=true
Engine + provisioning options (fluent, set before InitializeAsync):
| Method | Effect |
|---|---|
.UsePostgres() |
Use PostgreSQL instead of the default SQL Server. |
.WithSQLProject(path) |
Build + deploy a dacpac from a .sqlproj (SQL Server only). |
.WithScripts(paths...) |
Execute raw .sql script files in order. |
.WithEfMigrations(cs => ...) |
Run EF migrations via a delegate — the package stays EF-free; you bring your own DbContext. |
.WithSchema((cs, ct) => ...) |
General provisioning seam (any custom logic). |
.WithNetwork(network, alias) |
Attach the container to a shared docker network. |
Notes:
- Type name is all-caps
SQLFixtureand the namespace isSolTechnology.Core.SQL.Testing(per ADR-001). - DacFx stays in
SolTechnology.Core.SQLat runtime (used bySQLProjectDeployer); only the test-only fixture moved to the companion package. - Container lifetime /
TESTCONTAINERS_REUSEreuse is the shared model from theQuality.md → Container lifetime & reuse.
Health check
builder.Services.AddHealthChecks()
.AddSqlHealthCheck(); // opens a fresh connection + SELECT 1
| Aspect | Behaviour |
|---|---|
| Reachable | Healthy |
| Unreachable / timeout | Unhealthy (configurable via failureStatus) |
| Caller-cancellation | Rethrows (not Unhealthy) |
| Timeout | 5 s per-call (configurable) |
The check deliberately bypasses the SQLConnectionFactory's Polly retry ladder — a health probe
must be fast and honest, not wait 3+9+27 s against a dead server.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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. |
-
net10.0
- Microsoft.Data.SqlClient (>= 7.0.1)
- Microsoft.Extensions.Configuration (>= 10.0.9)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.9)
- Microsoft.Extensions.DependencyInjection (>= 10.0.9)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.9)
- Microsoft.Extensions.Options (>= 10.0.9)
- Microsoft.SqlServer.DacFx (>= 170.4.83)
- Polly (>= 8.7.0)
- SolTechnology.Core (>= 1.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.