|
| 1 | +# CLAUDE.md |
| 2 | + |
| 3 | +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. |
| 4 | + |
| 5 | +## Project Overview |
| 6 | + |
| 7 | +EntityFrameworkCore.Triggered is a library that adds trigger support (before/after save hooks) to Entity Framework Core. Triggers react to entity changes during `SaveChanges` via `IBeforeSaveTrigger<T>`, `IAfterSaveTrigger<T>`, and related interfaces. |
| 8 | + |
| 9 | +## Build & Test Commands |
| 10 | + |
| 11 | +```bash |
| 12 | +# Build (default is V3 / .NET 6.0) |
| 13 | +dotnet build EntityFrameworkCore.Triggered.sln |
| 14 | + |
| 15 | +# Run all tests |
| 16 | +dotnet test EntityFrameworkCore.Triggered.sln |
| 17 | + |
| 18 | +# Run a single test project |
| 19 | +dotnet test test/EntityFrameworkCore.Triggered.Tests |
| 20 | + |
| 21 | +# Run a specific test |
| 22 | +dotnet test test/EntityFrameworkCore.Triggered.Tests --filter "FullyQualifiedName~TriggerSessionTests.RaiseBeforeSaveTriggers" |
| 23 | + |
| 24 | +# Build for V2 (.NET Standard 2.1) |
| 25 | +dotnet build EntityFrameworkCore.Triggered.sln -c ReleaseV2 |
| 26 | + |
| 27 | +# Build for V1 (.NET Standard 2.0) |
| 28 | +dotnet build EntityFrameworkCore.Triggered.sln -c ReleaseV1 |
| 29 | + |
| 30 | +# Pack NuGet packages |
| 31 | +dotnet pack EntityFrameworkCore.Triggered.sln -c Release |
| 32 | +``` |
| 33 | + |
| 34 | +## Architecture |
| 35 | + |
| 36 | +### Project Dependency Graph |
| 37 | + |
| 38 | +``` |
| 39 | +Abstractions <── Core (EntityFrameworkCore.Triggered) <── Extensions |
| 40 | + <── Transactions |
| 41 | +Transactions.Abstractions <── Transactions |
| 42 | +``` |
| 43 | + |
| 44 | +- **Abstractions**: Pure interfaces (`IBeforeSaveTrigger<T>`, `IAfterSaveTrigger<T>`, `ITriggerContext<T>`, `ITriggerSession`, `ChangeType`, lifecycle triggers). No EF Core dependency. |
| 45 | +- **Core**: Main implementation — `TriggerSession` (orchestrator, ~400 lines), `TriggerService`, `TriggerContext`, trigger discovery, cascade strategies, and EF Core integration via `UseTriggers()`. |
| 46 | +- **Extensions**: Assembly scanning for trigger discovery (`AddAssemblyTriggers`). |
| 47 | +- **Transactions**: Transaction-scoped triggers (`IBeforeCommitTrigger`, `IAfterCommitTrigger`). |
| 48 | + |
| 49 | +### Key Internal Components |
| 50 | + |
| 51 | +- **TriggerSession** (`src/EntityFrameworkCore.Triggered/TriggerSession.cs`): Core orchestrator that coordinates trigger discovery, invocation, and cascading during SaveChanges. |
| 52 | +- **TriggerContextTracker** (`Internal/`): Wraps EF Core's ChangeTracker to discover pending entity changes. |
| 53 | +- **TriggerDiscoveryService** (`Internal/`): Resolves registered triggers for entity types, supporting type inheritance and priority ordering. |
| 54 | +- **Descriptor classes** (`Internal/Descriptors/`): Handle invocation of specific trigger types (BeforeSave, AfterSave, etc.) via reflection. |
| 55 | +- **CascadeStrategies** (`Internal/CascadeStrategies/`): Control re-discovery of changes after triggers modify entities. Default is `EntityAndTypeCascadeStrategy`. |
| 56 | + |
| 57 | +### Registration Entry Points |
| 58 | + |
| 59 | +- `UseTriggers()` on `DbContextOptionsBuilder` — core configuration |
| 60 | +- `AddTriggeredDbContext<T>()` / `AddTriggeredDbContextPool<T>()` / `AddTriggeredDbContextFactory<T>()` — service collection helpers in `Extensions/ServiceCollectionExtensions.cs` |
| 61 | + |
| 62 | +## Multi-Version Strategy |
| 63 | + |
| 64 | +The project supports multiple EF Core versions via build configurations and conditional compilation: |
| 65 | + |
| 66 | +| Config | Target | Preprocessor Symbol | EF Core | |
| 67 | +|--------|--------|---------------------|---------| |
| 68 | +| Release (V3) | net6.0 | `EFCORETRIGGERED3` | 6.0.0 | |
| 69 | +| ReleaseV2 | netstandard2.1 | `EFCORETRIGGERED2` | 3.1.x | |
| 70 | +| ReleaseV1 | netstandard2.0 | `EFCORETRIGGERED1` | 3.1.x | |
| 71 | + |
| 72 | +Version-specific code uses `#if EFCORETRIGGERED3` guards. The current branch (`v3`) targets V3. |
| 73 | + |
| 74 | +## Build Settings |
| 75 | + |
| 76 | +- **TreatWarningsAsErrors**: enabled globally (`Directory.Build.props`) |
| 77 | +- **Nullable reference types**: enabled |
| 78 | +- **LangVersion**: 9.0 |
| 79 | +- **Strong naming**: enabled (signed with `EntityFrameworkCore.Triggered.snk`) |
| 80 | + |
| 81 | +## Test Projects |
| 82 | + |
| 83 | +- `EntityFrameworkCore.Triggered.Tests` — unit tests (xUnit), uses EF Core InMemory provider |
| 84 | +- `EntityFrameworkCore.Triggered.IntegrationTests` — full SaveChanges lifecycle tests |
| 85 | +- `EntityFrameworkCore.Triggered.Extensions.Tests` — assembly trigger discovery |
| 86 | +- `EntityFrameworkCore.Triggered.Transactions.Tests` — transaction trigger behavior |
| 87 | +- `EntityFrameworkCore.Triggered.Analyzers.Tests` — Roslyn analyzer tests |
0 commit comments