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.
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.
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.
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.
EF Core’s entity discovery is thorough by design. In a plugin architecture, that thoroughness becomes a liability: navigation properties pull plugin entities into the host migration, creating shared schema ownership that breaks plugin isolation, causes schema drift, and makes clean plugin uninstalls impossible.