Skip to content

fix: harden caching, invalidation and Redis provider - #78

Merged
vposd merged 1 commit into
mainfrom
fix/review-hardening
Oct 19, 2026
Merged

vposd merged 1 commit into
mainfrom
fix/review-hardening

Conversation

@vposd

@vposd vposd commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Fixes

  • Cache keys include captured values, method targets and generic arguments; non-relational providers (InMemory, Cosmos) no longer share one key.
  • MemoryCacheProvider: replacing an entry no longer drops its tag tracking.
  • Entity detection covers query roots in joins and subqueries.
  • Invalidation uses EF metadata for changed types (proxies, inheritance, owned types, many-to-many).
  • Reference-counted stampede lock; First/Single are protected too.
  • Pending invalidations are bound to the DbContext: kept after a failed save inside a transaction, no leak on dispose; TransactionScope invalidates on commit.
  • Redis: chunked tag deletes, tag-set TTLs only extended, sliding expiration honoured, ClearAsync skips replicas.
  • DefaultOptions and AutoInvalidation configuration are honoured.

Changes

  • Cached queries execute with AsNoTracking (identity resolution preserved).
  • AddCacheInvalidation throws when no DbContextOptions is registered.
  • New public CacheTags.ForEntity() / ForEntity(Type).
  • EnableLogging and ICacheInvalidator.RegisterCacheEntry marked [Obsolete].
  • XML docs enforced for library projects; README and CHANGELOG corrected.

Demo

  • Fixed tag and tenant-filter bugs and the Docker build context.
  • Redis provider switch, docker-compose Redis service, new scenarios (subquery, SkipIf, sliding/IgnoreContext, ExecuteUpdate, TransactionScope, background job) with integration tests.

… demo

Fixes
- Cache keys include captured values, method targets and generic arguments;
  non-relational providers (InMemory, Cosmos) no longer share one key.
- MemoryCacheProvider: replacing an entry no longer drops its tag tracking.
- Entity detection covers query roots in joins and subqueries.
- Invalidation uses EF metadata for changed types (proxies, inheritance,
  owned types, many-to-many).
- Reference-counted stampede lock; First/Single are protected too.
- Pending invalidations are bound to the DbContext: kept after a failed save
  inside a transaction, no leak on dispose; TransactionScope invalidates on commit.
- Redis: chunked tag deletes, tag-set TTLs only extended, sliding expiration
  honoured, ClearAsync skips replicas.
- DefaultOptions and AutoInvalidation configuration are honoured.

Changes
- Cached queries execute with AsNoTracking (identity resolution preserved).
- AddCacheInvalidation<T> throws when no DbContextOptions<T> is registered.
- New public CacheTags.ForEntity<T>() / ForEntity(Type).
- EnableLogging and ICacheInvalidator.RegisterCacheEntry marked [Obsolete].
- XML docs enforced for library projects; README and CHANGELOG corrected.

Demo
- Fixed tag and tenant-filter bugs and the Docker build context.
- Redis provider switch, docker-compose Redis service, new scenarios
  (subquery, SkipIf, sliding/IgnoreContext, ExecuteUpdate, TransactionScope,
  background job) with integration tests.
@vposd
vposd merged commit e00fa4c into main Oct 19, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant