Changelog
Notable changes in each release.
All notable changes to the ArturRios.Data packages are recorded in this file.
The format is based on Keep a Changelog, and each package adheres to Semantic Versioning.
Packages are versioned and released independently. Each release is tagged <PackageId>@<version> and has its own
section, headed [<PackageId> <version>], newest first.
Unreleased
ArturRios.Data.Relational.Core 5.0.1 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages.
Fixed
- The package README imports
Entity<TKey>from its namespace, lists the MySQL provider, links to pages that exist, and links to the upgrade guide in this file instead of repeating it. - A failed
EfRepositorywrite no longer poisons the context. EF Core keeps a rejected change pending, so after an error envelope (a unique violation, say) every later write on the same scoped context replayed it and failed too; the pending changes are now discarded. - When a save fails,
BaseDbContextrestores the concurrency stamps it had just regenerated, so aVersionedEntity<TKey>keeps the stamp the database still holds and a retry is not reported as a concurrency conflict. BaseDbContextregenerates concurrency stamps on every save overload, includingSaveChanges(bool)andSaveChangesAsync(bool, CancellationToken), which skipped it before.EfUnitOfWorkreturns an error envelope when the transaction cannot begin (no connection, or a transaction already open on the context) instead of throwing, and clears the change tracker after a rollback, which still held the rolled-back writes as saved.- The “no
IDatabaseProviderregistered” error names the package and the registration call that exist (for exampleArturRios.Data.SqliteandAddSqliteProvider()), notArturRios.Data.Core.SqLiteandAddSqLiteProvider().
ArturRios.Data.Sqlite 4.0.0 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. - Depends on
ArturRios.Data.Relational.Core5.0.1 instead of 4.0.1. No code changes: the package’s public API (SqliteProvider,AddSqliteProvider()) uses onlyIDatabaseProviderandDatabaseType, which 5.0.0 left unchanged. Upgrading it moves the application ontoRelational.Core5.0.1; see Upgrading from 4.x to 5.0.
Fixed
- The package README names the two-argument repository interfaces, and its documentation links point at pages that exist.
ArturRios.Data.PostgreSql 4.0.0 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. - Depends on
ArturRios.Data.Relational.Core5.0.1 instead of 4.0.1. No code changes: the package’s public API (PostgreSqlProvider,AddPostgreSqlProvider()) uses onlyIDatabaseProviderandDatabaseType, which 5.0.0 left unchanged. Upgrading it moves the application ontoRelational.Core5.0.1; see Upgrading from 4.x to 5.0.
Fixed
- The package README names the two-argument repository interfaces, and its documentation links point at pages that exist.
ArturRios.Data.MySql 2.0.0 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. - Depends on
ArturRios.Data.Relational.Core5.0.1 instead of 4.0.1. No code changes: the package’s public API (MySqlProvider,AddMySqlProvider()) uses onlyIDatabaseProviderandDatabaseType, which 5.0.0 left unchanged. Upgrading it moves the application ontoRelational.Core5.0.1; see Upgrading from 4.x to 5.0.
Fixed
- The package README names the two-argument repository interfaces, and its documentation links point at pages that exist.
MySqlProviderdetects the server version once per connection string and reuses it. Before, every DI scope (every request, in a web app) opened a connection to query the server version again.
ArturRios.Data.Dapper 5.0.0 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. - Depends on
ArturRios.Data.Relational.Core5.0.1 instead of 4.0.1. No code changes: the package’s public API usesBaseDbContextandRelationalErrors, which 5.0.0 left unchanged. Upgrading it moves the application ontoRelational.Core5.0.1; see Upgrading from 4.x to 5.0.
Fixed
- The package README’s documentation links point at pages that exist, and its examples list MySQL among the providers and import the provider they register.
- The
QueryFirstOrDefaultandQuerySingleOrDefaultdocs say that no row givesdefault(T), which is0rather thannullfor a non-nullable value type.
ArturRios.Data.MongoDb 3.0.0 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. Update/UpdateAsync(and the range variants) of a document that no longer exists return the concurrency-conflict error, asEfRepositorydoes. Before, the write matched nothing and reported success.Delete/DeleteAsyncof aVersionedDocumentdeletes only at the version the caller holds; a stale or missing one returns the concurrency-conflict error, asEfRepositoryandDynamoRepositorydo. Before, a stale delete removed the newer version. Deleting a plainDocumentstays idempotent.DeleteRange/DeleteRangeAsyncreturn only the ids actually deleted, as the interface documents andEfRepositorydoes. Before, they returned every id passed in.
Fixed
- The package README’s documentation links point at pages that exist.
- The package README lists every service
AddMongoDataregisters and says thatQuery()is not enveloped. - When
MongoUnitOfWorkcannot start a transaction, for example on a standalone server, it returns an error envelope and restores the context’s previous session. Before, the exception escaped the envelope and the context kept the disposed session, so every later repository call on that context failed. GetById/GetByIdAsyncwith an id that is not a validObjectIdreturn a successfulnull, like any other id that matches nothing, instead of a data-access error.DeleteRangeskips such ids.CreateRange/CreateRangeAsyncwith no documents succeed with an empty result, asEfRepositorydoes, instead of returning a data-access error.
ArturRios.Data.DynamoDb 2.0.2 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. - The concurrency-conflict message reads “the item was modified or removed by another process”, matching the relational and MongoDB messages; a conditional check also fails when the item is gone.
Fixed
- The package README’s documentation links point at pages that exist.
ArturRios.Data.Export 2.2.0 - 2026-10-29
Added
CsvOptions.EscapeFormulas(defaulttrue) controls the CSV formula-injection guard described under Security.
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. WriteToFileAsyncwrites to a temporary file beside the target and moves it into place when the write completes. A failed or cancelled export leaves an existing file untouched and no partial file behind; before, the file was truncated first and left half-written.
Fixed
- The package README’s documentation links point at pages that exist.
- The package README says that Excel writes booleans, dates
and numbers as native cell values, and that
ExportFormat.ExcelneedsAddExcelExport().
Security
CsvExporterneutralizes formula injection. A text value that starts with=,+,-,@, a tab or a carriage return is written with a leading', so a spreadsheet that opens the file shows it as text instead of running it (for example=HYPERLINK(...)or a DDE payload supplied by a user). Numbers and other formatted values are unchanged. SetCsvOptions.EscapeFormulas = falseto write text verbatim.
ArturRios.Data.Export.Excel 2.1.0 - 2026-10-29
Changed
- The project URL is the documentation site’s new address,
https://docs.artur-rios.tech/dotnet-data, since the site moved from GitHub Pages. DateOnly,TimeSpanandTimeOnlyvalues are written as native date and time cells instead of text.WriteToFileAsyncwrites to a temporary file beside the target and moves it into place when the write completes. A failed or cancelled export leaves an existing file untouched and no partial file behind; before, the file was truncated first and left half-written.
Fixed
- The package README’s documentation links point at pages that exist.
- The package README says that Excel writes booleans, dates
and numbers as native cell values, and that
ExportFormat.ExcelneedsAddExcelExport(). - A
doubleorfloatthat isNaNor infinite is written as text. Before, it failed the whole export.
ArturRios.Data.Relational.Core 5.0.0 - 2026-10-07
Added
Entity<TKey>andVersionedEntity<TKey>, keyed by anyIEquatable<TKey>(long,int,Guid,string), withIRepository<T, TKey>,IReadOnlyRepository<T, TKey>, their async counterparts andEfRepository<T, TKey>. DI registers the two-argument contracts.IVersionedEntity, soBaseDbContextrefreshes concurrency stamps for any key type.
Removed
- Breaking:
Entity,VersionedEntity, the single-argument repository interfaces andEfRepository<T>. Derive fromEntity<long>/VersionedEntity<long>and injectIRepository<T, long>(and friends) to keep the previous behavior; see Upgrading from 4.x to 5.0.
Upgrading from 4.x to 5.0
The non-generic Entity, VersionedEntity, single-argument repository interfaces and
EfRepository<T> were removed; every entity now declares its key type. To keep the previous
long keys, add <long> everywhere the old types appear:
| 4.x | 5.x |
|---|---|
class Product : Entity | class Product : Entity<long> |
class Product : VersionedEntity | class Product : VersionedEntity<long> |
IRepository<Product> (and the other three interfaces) | IRepository<Product, long> |
EfRepository<Product> | EfRepository<Product, long> |
The database schema is unchanged for long keys, so no migration is needed.
ArturRios.Data.MySql 1.0.0 - 2026-08-24
Added
- First release:
AddMySqlProvider()registers a MySQL / MariaDB provider forArturRios.Data.Relational.Core, built onMicroting.EntityFrameworkCore.MySql10.0.10, a maintained fork of Pomelo with EF Core 10 support.
ArturRios.Data.Export 2.1.0 - 2026-08-24
Added
JsonOptions.Effective, the cachedJsonSerializerOptionsthe exporter serializes with.
Changed
JsonExporterreuses oneJsonSerializerOptionsinstead of building a fresh one, and losing System.Text.Json’s metadata cache, on every export.- Every await is configured with
ConfigureAwait(false). ArturRios.Outputupdated to 3.2.0 andMicrosoft.Extensions.*to 10.0.11.
ArturRios.Data.Sqlite 3.1.0 - 2026-08-24
Changed
SQLitePCLRaw.bundle_e_sqlite3updated from 2.1.12 to 3.0.5, andMicrosoft.EntityFrameworkCore.Sqliteto 10.0.11.
ArturRios.Data.Relational.Core 4.0.1 - 2026-08-24
Changed
- Every await is configured with
ConfigureAwait(false), so a caller that blocks on a returned task cannot deadlock on its synchronization context. ArturRios.Outputupdated to 3.2.0, and EF Core andMicrosoft.Extensions.*to 10.0.11.
ArturRios.Data.Dapper 4.0.1 - 2026-08-24
Changed
- Every await is configured with
ConfigureAwait(false). Microsoft.Extensions.*updated to 10.0.11.
ArturRios.Data.PostgreSql 3.0.2 - 2026-08-24
Changed
Microsoft.Extensions.DependencyInjection.Abstractionsupdated to 10.0.11.
ArturRios.Data.MongoDb 2.0.1 - 2026-08-24
Changed
- Every await is configured with
ConfigureAwait(false). MongoDB.Driverupdated to 3.11.0,ArturRios.Outputto 3.2.0 andMicrosoft.Extensions.*to 10.0.11.
ArturRios.Data.DynamoDb 2.0.1 - 2026-08-24
Changed
- Every await is configured with
ConfigureAwait(false). AWSSDK.DynamoDBv2updated to 4.0.103.4,ArturRios.Outputto 3.2.0 andMicrosoft.Extensions.*to 10.0.11.
ArturRios.Data.Export.Excel 2.0.1 - 2026-08-24
Changed
ClosedXMLupdated to 0.105.1.
ArturRios.Data.PostgreSql 3.0.1 - 2026-08-14
Changed
- Depends on
ArturRios.Data.Relational.Core4.0.0. No code changes.
ArturRios.Data.Sqlite 3.0.1 - 2026-08-14
Changed
- Depends on
ArturRios.Data.Relational.Core4.0.0. No code changes.
ArturRios.Data.Relational.Core 4.0.0 - 2026-08-14
Added
RelationalErrors, which classifies a failure into a fixed caller-safe message: unique violation, integrity violation, concurrency conflict, transient, or generic.
Changed
- Breaking: cancellation propagates out of
EfUnitOfWorkinstead of being enveloped.
Fixed
EfUnitOfWorkrolls back independently of the caller’s cancellation token and swallows its own rollback errors, so a cancellation no longer makes rollback throw out of a method documented to return an envelope.- Provider validation no longer crashes on an
IDatabaseProviderwhose implementation type has constructor dependencies.
Security
- Breaking: error envelopes no longer carry the provider’s exception text, which could name the violated index and
the conflicting value, columns, SQL fragments or tables. They carry the fixed messages from
RelationalErrors.
ArturRios.Data.Dapper 4.0.0 - 2026-08-14
Added
DapperSqlQuerytakes an optionalILoggerand writes the full exception there. Query parameters are never logged.
Changed
- Breaking: the
Guarded/GuardedAsyncmembers ofDapperSqlQueryare instance members and take the SQL text.
Security
- Breaking: error envelopes carry the fixed messages from
RelationalErrorsinstead of the provider’s exception text.
ArturRios.Data.MongoDb 2.0.0 - 2026-08-14
Added
MongoErrors, which classifies a failure into a fixed caller-safe message.MongoDocumentRepositorytakes an optionalILoggerand writes the full exception there. Document contents are never logged.
Changed
- Breaking: cancellation propagates out of
MongoUnitOfWorkinstead of being enveloped, and the guard andFailmembers ofMongoDocumentRepositoryare instance members with new parameters.
Fixed
MongoUnitOfWorkrolls back independently of the caller’s cancellation token, and restores the previous ambient session instead of clearing it, so a nested unit of work no longer de-enlists the outer one.MongoDocumentRepositoryreverts the optimistic-locking version bump when the replace throws, so a retry is no longer reported as a concurrency conflict.
Security
- Breaking: error envelopes carry fixed messages instead of the driver’s exception text, which could name collections and values.
ArturRios.Data.DynamoDb 2.0.0 - 2026-08-14
Added
DynamoRepositorytakes an optionalILoggerand writes the full exception there. Item contents are never logged.
Changed
- Breaking: the guard and
Failmembers ofDynamoRepositoryare instance members with new parameters. - Throttling and 5xx faults are reported as transient.
Security
- Breaking: error envelopes carry fixed messages instead of the SDK’s exception text, which could name tables and values.
ArturRios.Data.Export 2.0.0 - 2026-08-14
Added
ExporterBaseand every exporter take an optionalILoggerand write the full exception there. Exported data is never logged.
Changed
- Breaking: the guard and
Failmembers ofExporterBaseare instance members with new parameters, andExportFailedMessageis the whole message rather than a prefix.
Security
- Breaking: error envelopes carry fixed messages instead of the exception text, which could name file paths.
ArturRios.Data.Export.Excel 2.0.0 - 2026-08-14
Changed
- Breaking: built on
ArturRios.Data.Export2.0.0:ExcelExportertakes an optionalILogger, and its error envelopes carry fixed messages instead of the exception text.
ArturRios.Data.Relational.Core 3.0.2 - 2026-07-23
Changed
ArturRios.Outputupdated from 3.0.0 to 3.1.0.
ArturRios.Data.MongoDb 1.0.3 - 2026-07-23
Changed
ArturRios.Outputupdated from 3.0.0 to 3.1.0.
ArturRios.Data.DynamoDb 1.0.3 - 2026-07-23
Changed
ArturRios.Outputupdated from 3.0.0 to 3.1.0.
ArturRios.Data.Export 1.0.3 - 2026-07-23
Changed
ArturRios.Outputupdated from 3.0.0 to 3.1.0.
ArturRios.Data.Relational.Core 3.0.1 - 2026-07-23
Changed
ArturRios.Outputupdated from 2.0.1 to 3.0.0.
ArturRios.Data.MongoDb 1.0.2 - 2026-07-23
Changed
ArturRios.Outputupdated from 2.0.1 to 3.0.0.
ArturRios.Data.DynamoDb 1.0.2 - 2026-07-23
Changed
ArturRios.Outputupdated from 2.0.1 to 3.0.0, andAWSSDK.DynamoDBv2to 4.0.101.4.
ArturRios.Data.Export 1.0.2 - 2026-07-23
Changed
ArturRios.Outputupdated from 2.0.1 to 3.0.0.
ArturRios.Data.Relational.Core 3.0.0 - 2026-07-23
Added
AddDataConfigFromEnvironmentto read the data options from environment variables.
Changed
- Breaking:
AddDataConfig(IConfiguration, ...)is renamed toAddDataConfigFromSettingsand takes a required section name.
ArturRios.Data.Dapper 3.0.0 - 2026-07-23
Changed
- Breaking: depends on
ArturRios.Data.Relational.Core3.0.0, which renames the registration API.
ArturRios.Data.PostgreSql 3.0.0 - 2026-07-23
Changed
- Breaking: depends on
ArturRios.Data.Relational.Core3.0.0, which renames the registration API.
ArturRios.Data.Sqlite 3.0.0 - 2026-07-23
Changed
- Breaking: depends on
ArturRios.Data.Relational.Core3.0.0, which renames the registration API.
ArturRios.Data.Relational.Core 2.0.0 - 2026-07-22
Changed
- Breaking: entity ids are
longinstead ofint, through the repository interfaces andEfRepository(GetById, and theCreate,CreateRange,DeleteandDeleteRangereturn types). - Breaking:
EntityandVersionedEntitymoved to theArturRios.Data.Relational.Core.Entitiesnamespace.
ArturRios.Data.Dapper 2.0.0 - 2026-07-22
Changed
- Breaking: depends on
ArturRios.Data.Relational.Core2.0.0, where entity ids arelong.
ArturRios.Data.PostgreSql 2.0.0 - 2026-07-22
Changed
- Breaking: depends on
ArturRios.Data.Relational.Core2.0.0, where entity ids arelong.
ArturRios.Data.Sqlite 2.0.0 - 2026-07-22
Changed
- Breaking: depends on
ArturRios.Data.Relational.Core2.0.0, where entity ids arelong.
ArturRios.Data.Relational.Core 1.0.1 - 2026-07-15
Added
- A package README.
Changed
- EF Core and
Microsoft.Extensions.*updated to 10.0.10.
ArturRios.Data.Sqlite 1.0.1 - 2026-07-15
Added
- A package README.
Changed
Microsoft.EntityFrameworkCore.Sqliteupdated to 10.0.10.
Security
- References
SQLitePCLRaw.bundle_e_sqlite32.1.12 directly, lifting the bundled SQLite off 2.1.11 and its high-severity vulnerability (GHSA-2m69-gcr7-jv3q).
ArturRios.Data.PostgreSql 1.0.1 - 2026-07-15
Added
- A package README.
Changed
Npgsql.EntityFrameworkCore.PostgreSQLupdated to 10.0.3.
ArturRios.Data.Dapper 1.0.1 - 2026-07-15
Added
- A package README.
Changed
Microsoft.Extensions.DependencyInjection.Abstractionsupdated to 10.0.10.
ArturRios.Data.MongoDb 1.0.1 - 2026-07-15
Added
- A package README.
Changed
MongoDB.Driverupdated to 3.10.0 andMicrosoft.Extensions.*to 10.0.10.
ArturRios.Data.DynamoDb 1.0.1 - 2026-07-15
Added
- A package README.
Changed
AWSSDK.DynamoDBv2updated to 4.0.101.2 andMicrosoft.Extensions.*to 10.0.10.
ArturRios.Data.Export 1.0.1 - 2026-07-15
Added
- A package README.
Changed
MessagePackupdated to 3.1.8 andMicrosoft.Extensions.DependencyInjection.Abstractionsto 10.0.10.
ArturRios.Data.Export.Excel 1.0.1 - 2026-07-15
Added
- A package README.
ArturRios.Data.Relational.Core 1.0.0 - 2026-07-15
Added
- First release, succeeding the single
ArturRios.Datapackage:EntityandVersionedEntity(optimistic concurrency), sync and async repository interfaces that returnDataOutput/ProcessOutputenvelopes,EfRepository,BaseDbContext,EfUnitOfWorktransactions,DataAccessException, and theIDatabaseProviderseam with DI registration.
ArturRios.Data.Sqlite 1.0.0 - 2026-07-15
Added
- First release:
AddSqliteProvider()registers the SQLite provider forArturRios.Data.Relational.Core.
ArturRios.Data.PostgreSql 1.0.0 - 2026-07-15
Added
- First release:
AddPostgreSqlProvider()registers the PostgreSQL (Npgsql) provider forArturRios.Data.Relational.Core.
ArturRios.Data.Dapper 1.0.0 - 2026-07-15
Added
- First release:
ISqlQuery/IAsyncSqlQueryandDapperSqlQueryrun raw-SQL reads over the EF connection and transaction, registered withAddDapper().
ArturRios.Data.MongoDb 1.0.0 - 2026-07-15
Added
- First release:
Document/VersionedDocument, sync and async document repositories with server-sideFind, aQuery()escape hatch and opt-in optimistic concurrency,MongoUnitOfWorkmulti-document transactions, andAddMongoDataregistration.
ArturRios.Data.DynamoDb 1.0.0 - 2026-07-15
Added
- First release:
IAsyncDynamoRepository<T>andDynamoRepositoryover the AWS object-persistence model, with[DynamoDBVersion]optimistic concurrency, query, scan and batch operations, aServiceUrlfor DynamoDB Local / LocalStack, andAddDynamoDataregistration.
ArturRios.Data.Export 1.0.0 - 2026-07-15
Added
- First release: CSV, JSON, TXT and MessagePack exporters behind
IExporter<T>, column attributes, anIExporterFactorykeyed byExportFormat, andAddExportregistration.
ArturRios.Data.Export.Excel 1.0.0 - 2026-07-15
Added
- First release: a ClosedXML-backed
ExcelExporterthat addsExportFormat.Excel.
ArturRios.Data 1.0.0 - 2026-06-20
Added
Entity,ICrudRepository,IRangeRepository,IReadOnlyRepositoryandBaseDbContextOptions, with XML documentation.