Part of #5118 (compliance wave growth), epic #5110.
StringIdentitySingleStreamCompliance (wave 3) covers plain string-keyed aggregation. Two adjacent shape families are still tested twice, independently, in both repos:
- Strong-typed identifiers on aggregates (Guid-backed and string-backed wrappers)
- Modern C# aggregate shapes —
required members and primary constructors — which exercise the source generator's construction path, not the storage layer
Both run through FetchForWriting<T, TId> / FetchLatest<T, TId> on the shared IEventStoreOperations plus ordinary snapshot registration, so this is portable with no seam addition. The strong-typed id types themselves must be declared in the shared source (they compile per consumer anyway, which the package already requires).
What each store tests today
| Marten |
Polecat |
Aggregation/using_guid_based_strong_typed_id_for_aggregate_identity.cs |
Projections/using_guid_based_strong_typed_id_for_aggregate_identity.cs |
Aggregation/using_string_based_strong_typed_id_for_aggregate_identity.cs |
Projections/using_string_based_strong_typed_id_for_aggregate_identity.cs |
Aggregation/strong_typed_identifiers_on_aggregates_must_be_nullable.cs |
Events/Bug_4214_identity_map_strong_typed_ids.cs |
Bug_4542_required_members_primary_ctor.cs |
Projections/required_member_primary_ctor_projection_tests.cs |
Bug_4543_nullable_read_aggregate_param.cs |
Events/aggregate_type_resolution_tests.cs |
The Marten↔Polecat file names here are near-identical — this is the most literal duplication left in the two suites.
Scope
New AggregateIdentityShapeCompliance suite:
- Guid-backed strong-typed id: start stream,
FetchForWriting<T, TId>, FetchLatest<T, TId>, inline snapshot persisted under the unwrapped value
- String-backed strong-typed id: same
- The nullability rule (
strong_typed_identifiers_on_aggregates_must_be_nullable) — settle whether it is a shared rule or Marten-specific before porting; if shared, it belongs here, if not, it stays in Marten
required-member aggregate builds and evolves
- Primary-constructor aggregate builds and evolves
- Nullable read-aggregate parameter (
Bug_4543)
Acceptance
- Suite enrolled in both stores, zero capability gates
- Originals retired in both repos (five files each side)
Part of #5118 (compliance wave growth), epic #5110.
StringIdentitySingleStreamCompliance(wave 3) covers plain string-keyed aggregation. Two adjacent shape families are still tested twice, independently, in both repos:requiredmembers and primary constructors — which exercise the source generator's construction path, not the storage layerBoth run through
FetchForWriting<T, TId>/FetchLatest<T, TId>on the sharedIEventStoreOperationsplus ordinary snapshot registration, so this is portable with no seam addition. The strong-typed id types themselves must be declared in the shared source (they compile per consumer anyway, which the package already requires).What each store tests today
Aggregation/using_guid_based_strong_typed_id_for_aggregate_identity.csProjections/using_guid_based_strong_typed_id_for_aggregate_identity.csAggregation/using_string_based_strong_typed_id_for_aggregate_identity.csProjections/using_string_based_strong_typed_id_for_aggregate_identity.csAggregation/strong_typed_identifiers_on_aggregates_must_be_nullable.csEvents/Bug_4214_identity_map_strong_typed_ids.csBug_4542_required_members_primary_ctor.csProjections/required_member_primary_ctor_projection_tests.csBug_4543_nullable_read_aggregate_param.csEvents/aggregate_type_resolution_tests.csThe Marten↔Polecat file names here are near-identical — this is the most literal duplication left in the two suites.
Scope
New
AggregateIdentityShapeCompliancesuite:FetchForWriting<T, TId>,FetchLatest<T, TId>, inline snapshot persisted under the unwrapped valuestrong_typed_identifiers_on_aggregates_must_be_nullable) — settle whether it is a shared rule or Marten-specific before porting; if shared, it belongs here, if not, it stays in Martenrequired-member aggregate builds and evolvesBug_4543)Acceptance