Vulthil.Messaging.Inbox.Relational
1.0.0
dotnet add package Vulthil.Messaging.Inbox.Relational --version 1.0.0
NuGet\Install-Package Vulthil.Messaging.Inbox.Relational -Version 1.0.0
<PackageReference Include="Vulthil.Messaging.Inbox.Relational" Version="1.0.0" />
<PackageVersion Include="Vulthil.Messaging.Inbox.Relational" Version="1.0.0" />
<PackageReference Include="Vulthil.Messaging.Inbox.Relational" />
paket add Vulthil.Messaging.Inbox.Relational --version 1.0.0
#r "nuget: Vulthil.Messaging.Inbox.Relational, 1.0.0"
#:package Vulthil.Messaging.Inbox.Relational@1.0.0
#addin nuget:?package=Vulthil.Messaging.Inbox.Relational&version=1.0.0
#tool nuget:?package=Vulthil.Messaging.Inbox.Relational&version=1.0.0
Vulthil.Messaging.Inbox.Relational
Relational Entity Framework Core idempotency store for Vulthil.Messaging.Inbox. Gives transactional exactly-once consumer processing on relational databases: the inbox marker and the consumer's business writes commit in a single transaction, so a redelivered message is never processed twice.
Works with any relational EF Core provider (PostgreSQL, SQL Server, MySQL, SQLite). It relies on relational transactions, so it does not support the EF Core Cosmos provider — Cosmos needs a separate store with a different (effectively-once) mechanism.
Usage
Expose the inbox set on your DbContext and map the entity:
public sealed class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options), ISaveInboxMessages
{
public DbSet<InboxMessage> InboxMessages => Set<InboxMessage>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
=> modelBuilder.ApplyRelationalInbox();
}
Register the store and opt your messages into the inbox:
builder.Services.AddRelationalInbox<AppDbContext>();
builder.AddMessaging(messaging =>
{
messaging.UseRabbitMq(/* ... */);
messaging.ConfigureQueue("orders", q => q.AddConsumer<OrderPlacedConsumer>());
messaging.AddIdempotentInbox<OrderPlaced>();
});
The consumer keeps calling SaveChanges as usual — the store opens an ambient transaction, so those writes flush
without committing and are committed together with the idempotency marker. Add an EF Core migration for the
InboxMessage table as you would for any entity.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
-
net10.0
- Microsoft.EntityFrameworkCore.Relational (>= 10.0.9)
- OpenTelemetry.Extensions.Hosting (>= 1.16.0)
- SonarAnalyzer.CSharp (>= 10.27.0.140913)
- Vulthil.Messaging.Inbox (>= 1.0.0)
- Vulthil.Messaging.Inbox.EntityFrameworkCore (>= 1.0.0)
-
net9.0
- Microsoft.EntityFrameworkCore.Relational (>= 9.0.17)
- OpenTelemetry.Extensions.Hosting (>= 1.16.0)
- SonarAnalyzer.CSharp (>= 10.27.0.140913)
- Vulthil.Messaging.Inbox (>= 1.0.0)
- Vulthil.Messaging.Inbox.EntityFrameworkCore (>= 1.0.0)
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 | 47 | 6/21/2026 |