@@ -32,6 +32,40 @@ found is in this entry and the ones below it.
3232
3333## [Unreleased]
3434
35+ ### Fixed — `field.map` codegen completes: Java generates it, C# persists it
36+
37+ The subtype is registered in all five ports and TypeScript, Kotlin and Python already
38+ generated it. Java and C# were the two halves left, failing in opposite directions — and
39+ **this entry is CODEGEN only**, a bound the last paragraph states because the headline
40+ invites the wider reading.
41+
42+ **Java (`codegen-spring`) failed the build outright.** A `field.map` on an entity flowed
43+ into the DTO record and reached `SpringTypeMapper`'s unsupported-type throw, so any entity
44+ carrying one failed Java codegen. It now emits `java.util.Map<String, V>` — `V` the scalar
45+ named by `@valueType` or the value object named by `@objectRef` — and the value-object
46+ emission walk now spans a map's `@objectRef`, so a record reached only through a map is
47+ actually generated rather than merely named by a DTO. `isArray` does not apply to a map, so
48+ the type is never wrapped in `List<>`; every other port emits the map bare.
49+
50+ **C# (`MetaObjects.Codegen`) emitted the property but not the storage.**
51+ `EntityGenerator`'s `Dictionary<string, V>` property was already there;
52+ `DbContextGenerator` had no map branch, so EF got no column type and no converter — the
53+ property did not persist onto the `jsonb` column the TS-owned migration creates (ADR-0015).
54+ It now emits an explicit jsonb column type plus a shared converter/comparer pair, on
55+ entities, read-only projections and flattened value-object members alike. The comparer is
56+ load-bearing, not decoration: EF snapshots a value-converted property by reference, so a
57+ converter alone would leave an in-place `entity.Labels["k"] = v` undetected and the UPDATE
58+ would never fire.
59+
60+ **Scope.** No runtime persistence layer reads or writes a map except Python's
61+ `ObjectManager`, and no persistence- or api-contract-conformance corpus exercises
62+ `field.map` on any port — the subtype remains loader- and codegen-gated only, and
63+ [field-types.md](docs/features/field-types.md) carries the full runtime picture. An
64+ adopter who read "field.map now works" out of this entry would be over-reading it.
65+ **`metamodelVersion` does not move**: no registered vocabulary changed, and
66+ `expected-registry.json` is untouched.
67+
68+
3569### Added — `meta verify` advises when a provider still carries the prop 1.0 renamed away
3670
3771`<EntityFetcherProvider value={f}>` does not typecheck. The `0.x → 1.0` migration note and
0 commit comments