Daily DevOps & .NET - Where Code Meets Culture

Opinionated .NET, Azure and DevOps engineering. Hard-won lessons from production, no tutorials.

Incremental Source Generators Done Right: Prove the Cache Hits

Incremental Source Generators Done Right: Prove the Cache Hits

You followed the equality rules, you shaped the pipeline correctly, and your generator still might be re-running on every keystroke — because nobody ever asked the driver. Roslyn records exactly why each pipeline step re-executed, and you can assert against those reasons in a plain xUnit test. This is the test that turns “my generator is incremental” from a claim into a regression-protected fact, plus the catalog of anti-patterns it catches in the wild.
Incremental Source Generators Done Right: Pipeline Patterns That Scale

Incremental Source Generators Done Right: Pipeline Patterns That Scale

Part 1 of this series established the equality contract: every value flowing through an incremental generator pipeline must be comparable by value, or the cache misses and the generator re-runs on every keystroke. This part is about the pipeline itself — ForAttributeWithMetadataName as the entry point, where to filter, where to transform, how to combine providers without accidentally subscribing to the entire Compilation, and the Collect trap that silently breaks everything you fixed in part 1. It ends with a complete worked generator you can steal.
Incremental Source Generators Done Right: The Equality Contract

Incremental Source Generators Done Right: The Equality Contract

IIncrementalGenerator exists for one reason: to run only when its inputs actually change. Most generators fail at exactly that, because somewhere in the pipeline a value is compared by reference and the cache silently misses. This is part 1 of a 4-part series on getting incrementalism right, and it starts where every broken generator starts: the equality contract, the ImmutableArray trap, and the EquatableArray that fixes it.
EU AI Act for .NET Teams: What August 2026 Actually Demands

EU AI Act for .NET Teams: What August 2026 Actually Demands

The EU AI Act deadline everyone feared got pushed to December 2027, but nobody told you the transparency rules still land in weeks. Here is what actually changed, what still hits your chatbot in August, and the C# you need to prove it when someone asks.
EF Core Plugins: Owning Migrations with ExcludeFromMigrations

EF Core Plugins: Owning Migrations with ExcludeFromMigrations

ExcludeFromMigrations() keeps plugin entities fully queryable in the host DbContext while stripping migration ownership of their tables. Combined with per-context migration history tables, IDesignTimeDbContextFactory, and an explicit application-layer data access pattern, it enables truly independent plugin schema evolution.