TCIS.Pluggable.Persistence.PostgreSql
1.0.0-rc.15
dotnet add package TCIS.Pluggable.Persistence.PostgreSql --version 1.0.0-rc.15
NuGet\Install-Package TCIS.Pluggable.Persistence.PostgreSql -Version 1.0.0-rc.15
<PackageReference Include="TCIS.Pluggable.Persistence.PostgreSql" Version="1.0.0-rc.15" />
<PackageVersion Include="TCIS.Pluggable.Persistence.PostgreSql" Version="1.0.0-rc.15" />
<PackageReference Include="TCIS.Pluggable.Persistence.PostgreSql" />
paket add TCIS.Pluggable.Persistence.PostgreSql --version 1.0.0-rc.15
#r "nuget: TCIS.Pluggable.Persistence.PostgreSql, 1.0.0-rc.15"
#:package TCIS.Pluggable.Persistence.PostgreSql@1.0.0-rc.15
#addin nuget:?package=TCIS.Pluggable.Persistence.PostgreSql&version=1.0.0-rc.15&prerelease
#tool nuget:?package=TCIS.Pluggable.Persistence.PostgreSql&version=1.0.0-rc.15&prerelease
TCIS.Pluggable.Persistence.PostgreSql
The library providing PostgreSQL connection infrastructure for TCIS, supporting a Tri-Tier Multi-tenancy architecture via PostgreSqlRlsConnectionInitializer and PostgreSqlSchemaConnectionInitializer.
📦 Installation
dotnet add package TCIS.Pluggable.Persistence.PostgreSql
🚀 Registration / Setup (Program.cs)
Register the PostgreSQL Provider:
using TCIS.Pluggable.Persistence.PostgreSql;
var builder = WebApplication.CreateBuilder(args);
// Register the Pluggable DbContext with the PostgreSQL provider
builder.Services.AddPluggablePostgreSql<MyDbContext>();
Không truyền tên connection string. Chuỗi kết nối được lấy từ Tenant Store (SOT) qua
IMultiTenantContextAccessor<TenantInfo> tại thời điểm mỗi request.
Tier 2 (Schema-per-tenant): tên schema lấy từ TenantInfo.Identifier (SiteCode: TCI, CTL),
không phải TenantInfo.Id. Identifier phải là SQL identifier hợp lệ —
^[a-zA-Z_][a-zA-Z0-9_]{0,62}$, không chứa dấu -.
🔒 Tier 2 — search_path KHÔNG có schema dự phòng (mặc định)
PostgreSqlSchemaConnectionInitializer mặc định chỉ đặt schema của tenant:
SET search_path TO "tci"
Không có fallback. Tenant nào thiếu bảng — thường do chưa chạy migration — sẽ nhận lỗi
relation does not exist ngay, thay vì âm thầm đọc dữ liệu ở schema khác.
Trước 07/08/2026, initializer luôn thêm public vào cuối search_path. Điều đó khiến một tenant
thiếu bảng im lặng đọc dữ liệu ở public — nếu public lỡ chứa bảng nghiệp vụ (migration
chạy nhầm schema chẳng hạn) thì mọi tenant đều đọc được, và không có tín hiệu nào báo.
Khi nào cần khai báo schema dự phòng
// Extension (pgcrypto, uuid-ossp…) cài ở public và code gọi hàm không schema-qualify
new PostgreSqlSchemaConnectionInitializer("public")
// -> SET search_path TO "tci", public
// Dữ liệu tham chiếu dùng chung nằm ở schema riêng
new PostgreSqlSchemaConnectionInitializer("shared")
// -> SET search_path TO "tci", shared
Mọi schema đưa vào danh sách dự phòng đều trở thành nơi truy vấn có thể rơi vào. Tuyệt đối không đưa vào schema có chứa bảng nghiệp vụ mang dữ liệu.
Tên schema dự phòng cũng đi thẳng vào câu lệnh SQL nên phải qua cùng regex whitelist; sai định dạng là ném lỗi ngay lúc khởi tạo, không đợi tới lúc mở kết nối.
Bảng của tenant luôn thắng schema dự phòng, vì nó đứng trước trong search_path.
| Product | Versions 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 was computed. 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 was computed. 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. |
-
net8.0
- Dapper (>= 2.1.66)
- Microsoft.EntityFrameworkCore (>= 8.0.13)
- Microsoft.EntityFrameworkCore.Relational (>= 8.0.13)
- Microsoft.Extensions.Caching.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Caching.Memory (>= 8.0.1)
- Microsoft.Extensions.Configuration (>= 9.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.0)
- Microsoft.Extensions.DependencyInjection (>= 9.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Http (>= 9.0.0)
- Microsoft.Extensions.Logging (>= 9.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.0)
- Microsoft.Extensions.Options (>= 9.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 9.0.0)
- Microsoft.Extensions.Options.DataAnnotations (>= 8.0.0)
- Npgsql (>= 8.0.6)
- Npgsql.EntityFrameworkCore.PostgreSQL (>= 8.0.0)
- TCIS.Core (>= 1.0.0-rc.15)
- TCIS.MultiTenancy (>= 1.0.0-rc.15)
- TCIS.Pluggable.Persistence.EntityFrameworkCore (>= 1.0.0-rc.15)
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 |
|---|---|---|
| 1.0.0-rc.15 | 0 | 8/12/2026 |
| 1.0.0-rc.14 | 0 | 8/12/2026 |
| 1.0.0-rc.13 | 35 | 8/11/2026 |
| 1.0.0-rc.12 | 46 | 8/10/2026 |
| 1.0.0-rc.11 | 61 | 7/28/2026 |
| 1.0.0-rc.10 | 51 | 7/24/2026 |
| 1.0.0-rc.9 | 51 | 7/21/2026 |
| 1.0.0-rc.8 | 51 | 7/21/2026 |