You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Refine nav property language: match $metadata, not SchemaName
Use "navigation property name (case-sensitive, must match $metadata)"
instead of "PascalCase SchemaName" per review feedback. System lookups
like parentaccountid are lowercase, so "PascalCase" was imprecise.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Navigation property names are case-sensitive and must match the entity's `$metadata`. Using the logical name instead of the navigation property name results in 400 Bad Request errors.
31
33
32
34
**Critical rule:** The OData parser validates `@odata.bind` property names **case-sensitively** against declared navigation properties. Lowercasing `new_CustomerId@odata.bind` to `new_customerid@odata.bind` causes: `ODataException: An undeclared property 'new_customerid' which only has property annotations...`
- Verify column names exist and are spelled correctly
375
375
- Ensure custom columns include customization prefix
376
-
- For `@odata.bind` errors ("undeclared property"): the navigation property name before `@odata.bind` must use **PascalCase SchemaName**(e.g., `new_CustomerId@odata.bind`), not lowercase. The OData parser is case-sensitive for navigation property names. The SDK preserves `@odata.bind` key casing and emits a warning if it detects likely-wrong lowercase casing.
376
+
- For `@odata.bind` errors ("undeclared property"): the navigation property name before `@odata.bind`is case-sensitive and must match the entity's `$metadata` exactly (e.g., `new_CustomerId@odata.bind` for custom lookups, `parentaccountid@odata.bind`for system lookups). The SDK preserves `@odata.bind` key casing and emits a warning if it detects likely-wrong lowercase casing on custom lookups.
377
377
378
378
## Best Practices
379
379
@@ -386,7 +386,7 @@ except ValidationError as e:
386
386
5.**Use production credentials** - ClientSecretCredential or CertificateCredential for unattended operations
387
387
6.**Error handling** - Implement retry logic for transient errors (`e.is_transient`)
388
388
7.**Always include customization prefix** for custom tables/columns
389
-
8.**Use lowercase for column names, PascalCase for navigation properties** - Column names in `$select`/`$filter`/record payloads use lowercase LogicalNames. Navigation properties in `$expand` and `@odata.bind` keys use PascalCase SchemaName (e.g., `new_CustomerId@odata.bind`)
389
+
8.**Use lowercase for column names, match `$metadata`for navigation properties** - Column names in `$select`/`$filter`/record payloads use lowercase LogicalNames. Navigation properties in `$expand` and `@odata.bind` keys are case-sensitive and must match the entity's `$metadata` (PascalCase for custom lookups like `new_CustomerId`, lowercase for system lookups like `parentaccountid`)
390
390
9.**Test in non-production environments** first
391
391
10.**Use named constants** - Import cascade behavior constants from `PowerPlatform.Dataverse.common.constants`
- Verify column names exist and are spelled correctly
375
375
- Ensure custom columns include customization prefix
376
-
- For `@odata.bind` errors ("undeclared property"): the navigation property name before `@odata.bind` must use **PascalCase SchemaName**(e.g., `new_CustomerId@odata.bind`), not lowercase. The OData parser is case-sensitive for navigation property names. The SDK preserves `@odata.bind` key casing and emits a warning if it detects likely-wrong lowercase casing.
376
+
- For `@odata.bind` errors ("undeclared property"): the navigation property name before `@odata.bind`is case-sensitive and must match the entity's `$metadata` exactly (e.g., `new_CustomerId@odata.bind` for custom lookups, `parentaccountid@odata.bind`for system lookups). The SDK preserves `@odata.bind` key casing and emits a warning if it detects likely-wrong lowercase casing on custom lookups.
377
377
378
378
## Best Practices
379
379
@@ -386,7 +386,7 @@ except ValidationError as e:
386
386
5.**Use production credentials** - ClientSecretCredential or CertificateCredential for unattended operations
387
387
6.**Error handling** - Implement retry logic for transient errors (`e.is_transient`)
388
388
7.**Always include customization prefix** for custom tables/columns
389
-
8.**Use lowercase for column names, PascalCase for navigation properties** - Column names in `$select`/`$filter`/record payloads use lowercase LogicalNames. Navigation properties in `$expand` and `@odata.bind` keys use PascalCase SchemaName (e.g., `new_CustomerId@odata.bind`)
389
+
8.**Use lowercase for column names, match `$metadata`for navigation properties** - Column names in `$select`/`$filter`/record payloads use lowercase LogicalNames. Navigation properties in `$expand` and `@odata.bind` keys are case-sensitive and must match the entity's `$metadata` (PascalCase for custom lookups like `new_CustomerId`, lowercase for system lookups like `parentaccountid`)
390
390
9.**Test in non-production environments** first
391
391
10.**Use named constants** - Import cascade behavior constants from `PowerPlatform.Dataverse.common.constants`
0 commit comments