CoreSystem.Idempotency.PostgreSql 2.1.0

dotnet add package CoreSystem.Idempotency.PostgreSql --version 2.1.0
                    
NuGet\Install-Package CoreSystem.Idempotency.PostgreSql -Version 2.1.0
                    
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="CoreSystem.Idempotency.PostgreSql" Version="2.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CoreSystem.Idempotency.PostgreSql" Version="2.1.0" />
                    
Directory.Packages.props
<PackageReference Include="CoreSystem.Idempotency.PostgreSql" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CoreSystem.Idempotency.PostgreSql --version 2.1.0
                    
#r "nuget: CoreSystem.Idempotency.PostgreSql, 2.1.0"
                    
#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.
#:package CoreSystem.Idempotency.PostgreSql@2.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CoreSystem.Idempotency.PostgreSql&version=2.1.0
                    
Install as a Cake Addin
#tool nuget:?package=CoreSystem.Idempotency.PostgreSql&version=2.1.0
                    
Install as a Cake Tool

⚡ CoreSystem.Idempotency.PostgreSql

PostgreSQL storage provider for CoreSystem.Idempotency, built on the IIdempotencyStorage abstraction.

It is recommended for applications that require transactional consistency and long-lived storage.

The package targets .NET 8, .NET 9 and .NET 10, and ships an assembly for each of those frameworks.

NuGet Downloads License .NET PostgreSQL Dapper

It provides a durable implementation of IIdempotencyStorage, enabling reliable persistence of idempotency entries using PostgreSQL and Dapper.


✨ Features

  • ✅ Durable persistence
  • ✅ PostgreSQL storage
  • ✅ Dapper-based implementation
  • ✅ Idempotent schema script shipped with the package
  • ✅ Seamless integration with CoreSystem.Idempotency
  • ✅ OpenTelemetry compatible
  • ✅ Production-ready

📦 Installation

Install the framework.

dotnet add package CoreSystem.Idempotency

Install the PostgreSQL provider.

dotnet add package CoreSystem.Idempotency.PostgreSql

🚀 Quick Start

Configure PostgreSQL and register the provider.

{
  "ConnectionStrings": {
    "Idempotency": "Host=localhost;Port=5432;Database=idempotency_db;Username=admin;Password=admin"
  }
}
builder.Services
    .AddCoreIdempotency(options =>
    {
        builder.Configuration
            .GetSection("Core:Idempotency")
            .Bind(options);
    })
    .AddCoreIdempotencyPostgreSql(options =>
    {
        options.ConnectionString =
            builder.Configuration.GetConnectionString("Idempotency");
    });

PostgreSqlOptions.ConnectionString must be assigned explicitly; the provider throws at startup if it is null or empty.

Enable the middleware.

app.UseCoreIdempotency();

🗄 Database Setup

The provider does not create any schema. Apply the DDL yourself before the first request.

The database must already exist.

CREATE DATABASE idempotency_db;

Then apply the schema script shipped inside the package at scripts/postgres.sql. To extract it from the installed package, locate the package directory under ~/.nuget/packages/coresystem.idempotency.postgresql/<version>/scripts/postgres.sql.

psql -h localhost -U admin -d idempotency_db -f scripts/postgres.sql
CREATE TABLE IF NOT EXISTS idempotency_keys
(
    key TEXT PRIMARY KEY,

    state TEXT NOT NULL DEFAULT 'completed' CHECK (state IN ('in_progress', 'completed')),

    lease_id TEXT,

    request_fingerprint TEXT,

    hash_algorithm TEXT,

    status_code INTEGER,

    content_type TEXT,

    headers BYTEA,

    body BYTEA,

    created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,

    expires_at TIMESTAMPTZ NOT NULL
);

CREATE INDEX IF NOT EXISTS idx_idempotency_expires
    ON idempotency_keys (expires_at);

Important

state and lease_id are mandatory. The provider claims ownership of a key by writing state = 'in_progress' with a generated lease_id; only the holder of that lease may complete or release the entry. A table created without those columns fails on the first request.

The script is idempotent and safe to run on every deployment.


⚡ Why PostgreSQL?

PostgreSQL is ideal for:

  • Financial systems
  • Transactional applications
  • Long-term persistence
  • Existing PostgreSQL infrastructure
  • Applications requiring durability

📊 Characteristics

Feature Supported
Durable Persistence ✅
Relational Storage ✅
Schema Script Included ✅ (scripts/postgres.sql)
Distributed ✅
Automatic Cleanup ⚪ (Requires scheduled maintenance)

📚 Documentation

Complete documentation includes:

  • Installation
  • Database schema
  • Configuration
  • Maintenance
  • Performance considerations

🤝 Contributing

Contributions, bug reports and feature requests are always welcome. Fork the repository, create a feature branch, and open a pull request.


📄 License

Released under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  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.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  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. 
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
2.1.0 39 10/27/2026
2.0.2 95 10/18/2026
2.0.1 92 10/15/2026
2.0.0 394 8/8/2026

2.1.0: Multi-targeting release. The package now ships net8.0, net9.0 and net10.0 assets instead of net8.0 only, so a project on .NET 9 or .NET 10 gets an assembly compiled for its own target framework.
Dependency refresh. No code or API changes.
Dapper 2.1.79 to 2.1.89 and Npgsql 8.0.3 to 8.0.9, plus the refreshed transitive
graph (Microsoft.Extensions.* and OpenTelemetry.Extensions.Hosting 1.20.0).