Skip to content

DuckDB, AuroraDB and CockroachDB | New SQLite Family Athola, Turso | NativeAOT

Latest

Choose a tag to compare

@mikependon mikependon released this 23 Oct 08:22
· 13 commits to master since this release

RepoDB Core and Bulk Operations – Release Notes

Covers: everything shipped since the last minor release, v1.16.0 (2026-09-09), up to 2026-10-23.
Families: RepoDb (Core), the RepoDb.<Provider> packages and the RepoDb.<Provider>.BulkOperations packages.

263 commits landed since v1.16.0, 121 of them touching src/Providers. This document is a descriptive summary of what changed, why it matters and what you may need to do when upgrading.


Highlights

  • New database providers: DuckDB, CockroachDB, AuroraDB (MySqlConnector and Npgsql), plus new SQLite-family providers Turso and Ahtola. DuckDB, CockroachDB and both AuroraDB providers ship with Bulk Operations.
  • ExecuteQueryFirst / ExecuteQuerySingle (and their async forms) in the connection extensions and in the repositories.
  • ReplaceQueryField for SQL REPLACE expressions inside queries.
  • Strict Bulk column mappings (BulkColumnMappingsBehavior) across all Bulk packages.
  • NativeAOT / trimming compatibility for the Core, every provider and every Bulk package (net8.0+).
  • IDbSetting.Provider, IsSchemaSupported and AreIndexNamesUniquePerSchema added to the setting contract.
  • Property handlers for every provider, with full integration test suites.
  • A large static-analysis clean-up (Roslyn and Meziantou analyzers).
  • Fixes: temp tables in SQL Server, composite-key updates in MySQL, BulkUpdateAsync with identity keys, Schema.Table name quoting, conditional expression evaluation, DbField.GetHashCode.

New providers and packages

Package Notes
RepoDb.DuckDb and RepoDb.DuckDb.BulkOperations Initial support, property handlers, the UseDuckDb() overload that accepts addDefaultHandler, and a full integration suite (#1348, #1367).
RepoDb.CockroachDb and RepoDb.CockroachDb.BulkOperations Initial support and bulk operations; folders and namespaces standardised to CockroachDb (#1314).
RepoDb.AuroraDb.MySqlConnector and .BulkOperations Aurora MySQL through MySqlConnector (#1356).
RepoDb.AuroraDb.PostgreSql and .BulkOperations Aurora PostgreSQL through Npgsql (#1356).
RepoDb.Sqlite.Turso Turso provider built on the Microsoft SQLite adapter.
RepoDb.Sqlite.Ahtola Ahtola SQLite provider, with benchmarks.

The SQLite variants were restructured (#1377) so RepoDb.Sqlite.Microsoft, RepoDb.Sqlite.Turso and RepoDb.Sqlite.Ahtola share one structure. Copyright attributions for Ahtola and Turso were updated (#1373).


New features

Core

  • ExecuteQueryFirst and ExecuteQuerySingle (#1280, #1281, #1338, #1339): available on the connection extensions, BaseRepository and DbRepository, with test suites for every provider.
    • First returns the first row (or default).
    • Single returns the single row and fails if there is more than one.
  • ReplaceQueryField: lets a query use the SQL REPLACE function on a field (contributed by Paolo Bassi, #1332).
  • LiteralQueryField: moved to the write path and credited to its original author.
  • IDbSetting additions
    • Provider (#1366): the provider code of the setting (MSSQL, MYSQL, MYSQLC, MARIADB, AURORAMYSQL, PGSQL, ORACLE, DB2, DUCKDB, FIREBIRD, CLICKHOUSE, HANA, VERTICA, MSSQLITE, AHTOLA, TURSO). BaseDbSetting exposes it with a protected setter and includes it in the hash code. Every *DbHelper now reads the provider it stamps on DbField from the setting instead of using a literal.
    • IsSchemaSupported.
    • AreIndexNamesUniquePerSchema, moved into the *DbSetting classes.
  • Property handlers (#1342): shared handlers in Core plus dedicated ones for SQL Server, MySQL, MySqlConnector, MariaDB, MariaDbConnector, Oracle, PostgreSQL, EnterpriseDB, DB2, SAP HANA, Firebird and ClickHouse.
  • BaseDbSetting defaults are now passed explicitly for CockroachDB (#1314).

Bulk Operations

  • Strict column mappings (#1360): BulkColumnMappingsBehavior and a column-mappings exception, for SQL Server, PostgreSQL and every other Bulk package, so unmapped or invalid columns fail fast instead of silently misaligning.
  • identityBehavior added to the DB2, MySql, MySqlConnector and Oracle Bulk packages.
  • Async over Sync (#1363) replaces the command batcher for better, real bulk operations. SAP HANA has no true async driver, so this is the best fallback available there.
  • KeyColumnReturnBehavior audit (#1364): integration tests for all providers, plus fixes for Vertica and Firebird.
  • Aurora, DuckDB and CockroachDB gained complete Bulk Operations packages.

Bug fixes

Issue Fix
SQL Server temp tables (# / ##) (#1196) SqlServerDbHelper now detects temp tables and reads their metadata from tempdb. Reported by @daaleonardo.
BulkUpdateAsync intermittently failing when the key is an identity (#1351) Fixed in BulkInsert and TempTable, with a dedicated test. Reported by @cajuncoding.
MySQL Update failing with composite keys (discussion #1361) Command text cache and update path corrected, with CompositeKeyTest. Raised by @bpaolo71.
Schema.Table notation parsed as Database.Schema.Table StringExtension quoting rewritten; Ahtola and SQLite helpers aligned; new quotation and DottedTableTest tests.
Conditional expression value evaluation Fixed in ExpressionExtension (contributed by Benziza), with QueryGroupParseExpressionValuesTest.
NullReferenceException in DbField.GetHashCode Null-safe hash code computation.
PostgreSQL pseudo-table commands The bulk copy timeout is no longer passed in the wrong position.
Vertica and Firebird key-return behaviour Corrected (#1364).
Failing integration suites Repaired for DB2, Firebird, MySQL, MySqlConnector, MariaDB, MariaDbConnector and EnterpriseDB.

NativeAOT and trimming (contributed by Marc-André Moreau)

Core, every provider and every Bulk package now enable IsAotCompatible for net8.0 and later (polyfilled attributes for netstandard2.0), with the setting centralised in src/Directory.Build.props.

  • Entity generic parameters and Type flows annotated with DynamicallyAccessedMembers.
  • Runtime MakeGenericMethod / MakeGenericType calls removed from the expression compiler and the PostgreSQL bulk compiler.
  • Name-based reflection replaced with statically analysable lookups.
  • Anonymous parameter objects in the DbHelpers replaced with dictionaries; C# dynamic property handler calls removed; Activator-based connection cloning removed.
  • SQL Server table-valued parameter TypeName set statically.
  • Source-generated JSON context in RepoDb.Telemetry.Core.
  • User-defined conversion operators of decimal / DateTimeOffset preserved.

Code quality

  • Static analysis (#1328, #1331): Roslyn and Meziantou analyzers added; a broad refactor followed.
    • ConfigureAwait(false) on every await.
    • StringComparer or StringComparison on every string comparison.
    • ArgumentNullException instead of NullReferenceException for null arguments. Behaviour note: code catching NullReferenceException for these cases should catch ArgumentNullException instead.
  • Property handler renames: the EnterpriseDB, MariaDB, MariaDbConnector and CockroachDB handlers now carry their own provider prefix. If you referenced a shared name, update it.
  • Roslyn findings addressed in the Core and the providers.

Test coverage

  • Integration suites for DuckDB (#1367), AuroraDB, CockroachDB, MariaDB, MariaDbConnector, Ahtola, Turso, Microsoft SQLite, SAP HANA, Firebird, Vertica, ClickHouse and EnterpriseDB.
  • QueryFirst / QuerySingle suites for every provider.
  • Property handler suites for Core and every provider (#1342).
  • KeyColumnReturnBehavior suites for every provider (#1364).
  • Provider unit tests: DbSettingTest for the Provider property in each provider, DbHelperProviderTest in each provider's unit-test project, and DbSettingProviderTest in Core.

Packaging, documentation and branding

  • New per-provider logo, linked to the tutorial site, and refreshed READMEs with consistent descriptions and a tabular Credits section (including the Turso and Ahtola .NET authors); Oracle and Oracle Bulk icons updated.
  • CockroachDB added to the README, PACKAGES.md and the issue template.
  • The legacy RepoDb, RepoDb.SqLite and RepoDb.SQLite.System projects were moved to src/Decommissioned with history retained.
  • The RepoDB connectors were bumped to v1.1.0.

Dependency updates

All external references were bumped, including: DuckDB.NET.Data.Full 1.5.6 → 1.5.6.1, Microsoft.Data.Sqlite, Microsoft.Bcl.AsyncInterfaces, System.Collections.Immutable and System.Text.Json 10.0.12 → 10.0.13, MySql.Data 26.7.0 → 26.10.0, Oracle.ManagedDataAccess.Core 23.26.301 → 23.26.400, and Turso.Data.Sqlite.Provider 0.8.2 → 0.8.3.


Upgrade notes

  1. Custom IDbSetting implementations must now implement Provider (derive from BaseDbSetting to inherit it). Custom providers should set it to the same code their IDbHelper uses; Core depends on "PGSQL" for PostgreSQL-family behaviour.
  2. Replace NullReferenceException handling with ArgumentNullException where you relied on the old behaviour.
  3. Bulk strict mappings can surface mapping mistakes that were previously ignored; review the BulkColumnMappingsBehavior option on your Bulk calls.
  4. Update references to renamed EnterpriseDB, MariaDB, MariaDbConnector and CockroachDB property handlers.
  5. The SQLite packages were restructured; check package names if you use Turso, Ahtola or the Microsoft SQLite provider.

Contributors and credits

Thank you to everyone who made this release possible.

Contributor Contribution
Michael Camara Pendon (@mikependon) Maintainer. Authored the bulk of this release: new providers, QueryFirst/QuerySingle, Bulk improvements, test suites and static-analysis refactors.
Marc-André Moreau (@mamoreau-devolutions) NativeAOT and trimming compatibility across Core, providers, Schema and Telemetry, and the new Turso and Ahtola providers.
Paolo Bassi (@bpaolo71) ReplaceQueryField (#1332) and the composite-key discussion (#1361) that led to the MySQL update fix.
Nabil Gardon (@ngardon) Original author of LiteralQueryField.
Benziza Fix for conditional expression value evaluation.
@daaleonardo Reported the SQL Server temp table issue (#1196).
@cajuncoding Reported the BulkUpdateAsync identity issue (#1351).

Also thanks to the authors of the underlying libraries, including the Turso and Ahtola .NET authors, and to everyone who filed issues, discussions and feedback. Some commits were prepared with the assistance of AI coding tools (Claude and GitHub Copilot) and reviewed by the maintainer.

What's Changed

New Contributors

Full Changelog: v1.16.0...v1.17.0