Use ExtendEntityInterface + ExtendEntityTrait only when admins add fields at runtime via System → Entity Management; the trait supplies the magic get/set/isset/call for them. Entities not extended at runtime do not need it.
Ownership Decision Tree
Static/reference data? -> GLOBAL
Shared within org, not by department? -> ORGANIZATION
Department/team owned? -> BUSINESS_UNIT (include both org + BU fields)
Personal/assigned to user? -> USER (include both org + user fields)
CRITICAL: USER and BUSINESS_UNIT ownership both require an organization field. Missing it causes silent access control failures. See references/ownership-types.md for full config of all four types.
Migration: Creating a Table
Migrations live in src/Acme/Bundle/DemoBundle/Migrations/Schema/, one subdirectory per version (v10/, v11/). A Migration implementation builds the table in up(Schema $schema, QueryBag $queries) — worked example, including the ownership columns a USER/BUSINESS_UNIT entity needs, in references/v6.1.md.
Key Pitfalls
Missing organization field on USER/BUSINESS_UNIT ownership — Access control fails silently
Using old @ORM\ annotations instead of #[ORM\...] attributes — Doctrine won't recognize them in v6.1
Enum codes over 21 characters — Oro uses them to generate table names; exceeding the limit causes silent failures
Expecting admin-UI field delete to remove the column — it only soft-deletes (config state = Deleted, column kept), which blocks re-creating a field with the same name; see references/removing-extend-fields.md
See Also
references/ownership-types.md — all four ownership types and their field requirements