Skip to content
Shiny.NET

EF Core Extensions Releases

Feature
Shiny.EntityFrameworkCore.Sqlite.Mobile: spatial, vector and full-text search for EF Core on SQLite that works on iOS and Android. UseShinySpatial() translates NetTopologySuite predicates to managed SQLite functions, needs no mod_spatialite, and uses an optional HasSpatialIndex R*Tree pre-filter, plus GeoDistanceMeters/IsWithinMeters for distances in meters. UseShinyVectors() bundles sqlite-vec (statically linked on iOS, 16 KB-aligned on Android) and adds VectorDistance, HasVectorIndex and NearestTo. UseShinyFullText() adds HasFullTextIndex, FullTextMatch and FullTextRank on FTS5. The index tables are kept in sync by triggers and created by both EnsureCreated and migrations. SQLite only. See SQLite spatial.
Feature
Shiny.EntityFrameworkCore.Outbox: a transactional outbox. Map it with modelBuilder.AddOutbox(), enqueue with db.Enqueue(evt) in the same SaveChanges, or publish declaratively per entity with AddOutboxPublishing, which also handles store-generated keys. AddDbContextOutbox<TContext, TDispatcher> runs a background processor with retries, backoff, dead letters and ordered partitions; delivery is at least once. IOutboxAdmin and WatchOutbox are included. SQLite, PostgreSQL, SQL Server and MySQL. See Outbox.
Feature
Shiny.EntityFrameworkCore.Temporal: temporal history on every relational provider. Enable it per entity with HasHistory() and per context with UseEntityHistory(). The read side is HistoryAsync, AsOfAsync, AsOfAllAsync, ChangesByActorAsync, ChangesBetweenAsync, RestoreAsync and GetDiffBetweenAsync (RFC 6902). History is written in the same transaction as your save, and ExecuteUpdate/ExecuteDelete on a history entity throws by default, since those bulk writes would skip history. SQLite, PostgreSQL, SQL Server and MySQL. See Temporal History.
Feature
Shiny.EntityFrameworkCore.AI and Shiny.EntityFrameworkCore.Mcp: Microsoft.Extensions.AI tools and an MCP server over a DbContext. Register with AddDbContextAITools<TContext> or AddMcpServer().WithDbContext<TContext>. Each entity gets a scope (Where, optionally resolved per request) that the model cannot widen, and it is applied to the query in SQL. Ids outside the scope are reported as not found, and writes are checked against the scope. See AI Tools.
Feature
Shiny.EntityFrameworkCore.Seeding: versioned, run-once seeders (IDbSeeder<TContext>, AddDbSeeder, DbSeedRunner, UseVersionedSeeding), with an optional migrate or EnsureCreated step at startup. A lock on the marker row means a seeder runs exactly once even when several instances start together. See Versioned Seeding.
Feature
Shiny.EntityFrameworkCore.Aspire.Hosting: an AppHost seed gate (WithDbContextSeeder<TContext>, WithDbSeeder). It seeds on first setup (FirstTimeOnly) or on a deliberate rebuild (Recreate). The marker lives in the database itself, so dropping the container volume makes the next start seed again. See Aspire Seed Gate.