Repository navigation
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.ReplaceQueryFieldfor SQLREPLACEexpressions 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,IsSchemaSupportedandAreIndexNamesUniquePerSchemaadded 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,
BulkUpdateAsyncwith identity keys,Schema.Tablename 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
ExecuteQueryFirstandExecuteQuerySingle(#1280, #1281, #1338, #1339): available on the connection extensions,BaseRepositoryandDbRepository, 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 SQLREPLACEfunction on a field (contributed by Paolo Bassi, #1332).LiteralQueryField: moved to the write path and credited to its original author.IDbSettingadditionsProvider(#1366): the provider code of the setting (MSSQL,MYSQL,MYSQLC,MARIADB,AURORAMYSQL,PGSQL,ORACLE,DB2,DUCKDB,FIREBIRD,CLICKHOUSE,HANA,VERTICA,MSSQLITE,AHTOLA,TURSO).BaseDbSettingexposes it with a protected setter and includes it in the hash code. Every*DbHelpernow reads the provider it stamps onDbFieldfrom the setting instead of using a literal.IsSchemaSupported.AreIndexNamesUniquePerSchema, moved into the*DbSettingclasses.
- 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.
BaseDbSettingdefaults are now passed explicitly for CockroachDB (#1314).
Bulk Operations
- Strict column mappings (#1360):
BulkColumnMappingsBehaviorand a column-mappings exception, for SQL Server, PostgreSQL and every other Bulk package, so unmapped or invalid columns fail fast instead of silently misaligning. identityBehavioradded 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
Typeflows annotated withDynamicallyAccessedMembers. - Runtime
MakeGenericMethod/MakeGenericTypecalls 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#
dynamicproperty handler calls removed;Activator-based connection cloning removed. - SQL Server table-valued parameter
TypeNameset statically. - Source-generated JSON context in
RepoDb.Telemetry.Core. - User-defined conversion operators of
decimal/DateTimeOffsetpreserved.
Code quality
- Static analysis (#1328, #1331): Roslyn and Meziantou analyzers added; a broad refactor followed.
ConfigureAwait(false)on every await.StringComparerorStringComparisonon every string comparison.ArgumentNullExceptioninstead ofNullReferenceExceptionfor null arguments. Behaviour note: code catchingNullReferenceExceptionfor these cases should catchArgumentNullExceptioninstead.
- 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/QuerySinglesuites for every provider.- Property handler suites for Core and every provider (#1342).
- KeyColumnReturnBehavior suites for every provider (#1364).
- Provider unit tests:
DbSettingTestfor theProviderproperty in each provider,DbHelperProviderTestin each provider's unit-test project, andDbSettingProviderTestin 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.
CockroachDBadded to the README,PACKAGES.mdand the issue template.- The legacy
RepoDb,RepoDb.SqLiteandRepoDb.SQLite.Systemprojects were moved tosrc/Decommissionedwith 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
- Custom
IDbSettingimplementations must now implementProvider(derive fromBaseDbSettingto inherit it). Custom providers should set it to the same code theirIDbHelperuses; Core depends on"PGSQL"for PostgreSQL-family behaviour. - Replace
NullReferenceExceptionhandling withArgumentNullExceptionwhere you relied on the old behaviour. - Bulk strict mappings can surface mapping mistakes that were previously ignored; review the
BulkColumnMappingsBehavioroption on your Bulk calls. - Update references to renamed EnterpriseDB, MariaDB, MariaDbConnector and CockroachDB property handlers.
- 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
- Issue 1097 : Enhancement: Introduce the LiteralQueryField by @ngardon in #1125
- Add ReplaceQueryField for SQL REPLACE in queries by @bpaolo71 in #1332
- Fix code smells surfaced by the Roslyn / Meziantou.Analyzer static analyzer by @mikependon in #1333
- Configure Await and StringComparer provider by @mikependon in #1334
- Supported the 'ExecuteQueryFirst'. Ref: #1281 by @mikependon in #1335
- Supported the 'ExecuteQuerySingle'. Ref: #1280 by @mikependon in #1337
- Initial commit to support the QueryFirst. Ref: #1338 by @mikependon in #1340
- Initial commit to support the QuerySingle. Ref: #1339 by @mikependon in #1341
- Query First/Single Integration Test Suites by @mikependon in #1343
- Left over test suites for Query First/Single for MySqlConnector. Ref:… by @mikependon in #1344
- End-to-End Propety Handlers Implementation for all supported DB Providers by @mikependon in #1345
- Fix conditional expression value evaluation by @Benziza in #1347
- Logos by @mikependon in #1349
- DuckDB Support by @mikependon in #1350
- Fixed the intermittent issues of BulkUpdateAsync if the ID is an identity. Ref: #1351 by @mikependon in #1352
- Added the support of bulk operations to DuckDB. Ref: #1348 by @mikependon in #1353
- Add the RepoDb.CockroachDb provider by @mikependon in #1354
- Add RepoDb.CockroachDb.BulkOperations by @mikependon in #1355
- Add the RepoDb.AuroraDb.PostgreSql and RepoDb.AuroraDb.PostgreSql.BulkOperations providers by @mikependon in #1357
- Add the RepoDb.AuroraDb.MySqlConnector and RepoDb.AuroraDb.MySqlConnector.BulkOperations providers by @mikependon in #1358
- Add the
BulkColumnMappingsBehaviorsetting (Automatic, Strict, StrictBypass) to all the bulk-operations packages by @mikependon in #1362 - Fix null reference for hashCode in GetHashCode method by @mikependon in #1368
- Initial PR for the Schema Mover by @mikependon in #1369
- Add Turso provider based on Microsoft SQLite adapter by @mamoreau-devolutions in #1370
- Add Ahtola SQLite provider and benchmarks by @mamoreau-devolutions in #1371
- Schema Mover: MySQL, MariaDB, SQLite and CockroachDB providers by @mikependon in #1372
- Schema Mover: Oracle, Db2, Firebird, MariaDbConnector, SAP HANA and Vertica providers by @mikependon in #1375
- Schema Mover: Oracle, Db2, Firebird, MariaDbConnector, SAP HANA, Vertica, DuckDB, AuroraDB and ClickHouse providers by @mikependon in #1376
- Refactor RepoDb.Ahtola and RepoDb.Turso into RepoDb.Sqlite.Ahtola and RepoDb.Sqlite.Turso by @mikependon in #1378
- Make RepoDB NativeAOT and trimming compatible by @mamoreau-devolutions in #1374
- Moved the following to the 'Decommissioned' folder using the Github M… by @mikependon in #1380
- Added the Turso and Ahtola .NET author to the footer of the READMEs. by @mikependon in #1381
- Data mover Integration Tests and more Improvements by @mikependon in #1382
- Update README.md by @mikependon in #1383
New Contributors
- @Benziza made their first contribution in #1347
- @mamoreau-devolutions made their first contribution in #1370
Full Changelog: v1.16.0...v1.17.0