Summary
serializePublishedODataService (sdk/mpr/writer_odata.go:248) tries to resolve each EntitySet's owning EntityType through an internal map keyed by the wrong field. The lookup always returns empty, so the EntityTypePointer field is never written on ODataPublish\$EntitySet sub-documents. Studio Pro's EntitySet.Check (Mendix.Modeler.Integration.ODataServices.Publish.EntitySet.Check, line 53) then dereferences null and aborts the entire project checker with a NullReferenceException — hiding all other problems in the project, not just the published OData service.
Stack trace
System.AggregateException: One or more errors occurred. (Object reference not set to an instance of an object.)
---> System.NullReferenceException: Object reference not set to an instance of an object.
at Mendix.Modeler.Integration.ODataServices.Publish.EntitySet.Check(IProblems problems)
in Mendix.Modeler.Integration/ODataServices/Publish/EntitySet.cs:line 53
at Mendix.Modeler.Storage.TypeWalks.TypeWalk.ForEachObjectDo[TObject](...)
...
at Mendix.Modeler.Core.View.Problems.BackgroundCheckRunner.Check(IProject project, CancellationToken cancellationToken)
Root cause
In sdk/mpr/writer_odata.go:
// Line 235 — map keyed by ExposedName
entityTypeIDMap[et.ExposedName] = etID
// Line 248 — lookup by EntityTypeName (which holds the qualified entity name)
entityTypeID := entityTypeIDMap[es.EntityTypeName]
PublishedEntityType.ExposedName is the OData-facing name (e.g. \"Customers\").
PublishedEntitySet.EntityTypeName is the qualified entity name (e.g. \"OdTest.Customer\", set in astEntityDefToModel at mdl/executor/cmd_odata.go:1544).
These are different values, so the lookup returns \"\". In serializePublishedEntitySet (line 305):
if entityTypeID != \"\" {
doc[\"EntityTypePointer\"] = idToBsonBinary(entityTypeID)
}
The condition is always false → EntityTypePointer is never written. Studio Pro then can't navigate from EntitySet to its EntityType and NREs.
Reproduction
Run any MDL script that creates a published OData service with at least one publish entity block, then open the project in Studio Pro:
create persistent entity Demo.Customer ( Name: string(200) );
create odata service Demo.CustomerAPI (
path: '/odata/customers',
version: '1.0.0',
ODataVersion: OData4,
namespace: 'Demo.Customers'
)
authentication basic
{
publish entity Demo.Customer as 'Customers' ( ReadMode: source )
expose (*);
};
The resulting ODataPublish\$EntitySet BSON has no EntityTypePointer field. Confirmed by inspecting mprcontents/**/*.mxunit from a real project — every EntitySet sub-document is missing the field.
Proposed fix
One-line change in sdk/mpr/writer_odata.go:235:
- entityTypeIDMap[et.ExposedName] = etID
+ entityTypeIDMap[et.Entity] = etID
et.Entity is the qualified entity name (\"OdTest.Customer\"), matching how EntityTypeName is set on the corresponding EntitySet.
Add a test in sdk/mpr/writer_odata_test.go that asserts the EntitySet's EntityTypePointer matches the EntityType's \$ID. The existing TestSerializePublishedODataService covers other fields but not this pointer, which is why the bug landed undetected.
Related
- mxcli#590 — sibling Studio Pro NRE (
CallExternalAction.SchemaAction) from the same example file
- mxcli#594 — sibling Studio Pro NRE (
ODataRemoteEntitySource.RemoteId) from the same example file
- mxcli#592 — example-file workarounds; this issue is the underlying writer bug
Summary
serializePublishedODataService(sdk/mpr/writer_odata.go:248) tries to resolve each EntitySet's owning EntityType through an internal map keyed by the wrong field. The lookup always returns empty, so theEntityTypePointerfield is never written onODataPublish\$EntitySetsub-documents. Studio Pro'sEntitySet.Check(Mendix.Modeler.Integration.ODataServices.Publish.EntitySet.Check, line 53) then dereferencesnulland aborts the entire project checker with a NullReferenceException — hiding all other problems in the project, not just the published OData service.Stack trace
Root cause
In
sdk/mpr/writer_odata.go:PublishedEntityType.ExposedNameis the OData-facing name (e.g.\"Customers\").PublishedEntitySet.EntityTypeNameis the qualified entity name (e.g.\"OdTest.Customer\", set inastEntityDefToModelatmdl/executor/cmd_odata.go:1544).These are different values, so the lookup returns
\"\". InserializePublishedEntitySet(line 305):The condition is always false →
EntityTypePointeris never written. Studio Pro then can't navigate from EntitySet to its EntityType and NREs.Reproduction
Run any MDL script that creates a published OData service with at least one
publish entityblock, then open the project in Studio Pro:The resulting
ODataPublish\$EntitySetBSON has noEntityTypePointerfield. Confirmed by inspectingmprcontents/**/*.mxunitfrom a real project — every EntitySet sub-document is missing the field.Proposed fix
One-line change in
sdk/mpr/writer_odata.go:235:et.Entityis the qualified entity name (\"OdTest.Customer\"), matching howEntityTypeNameis set on the corresponding EntitySet.Add a test in
sdk/mpr/writer_odata_test.gothat asserts the EntitySet'sEntityTypePointermatches the EntityType's\$ID. The existingTestSerializePublishedODataServicecovers other fields but not this pointer, which is why the bug landed undetected.Related
CallExternalAction.SchemaAction) from the same example fileODataRemoteEntitySource.RemoteId) from the same example file