Skip to content

IEdmModel.ConvertToOpenApi() throws System.InvalidOperationException when having dollar-count similar path in controller #661

@ra-design

Description

@ra-design

I have a Count() operation in an ODataController. When I call ConvertToOpenApi on the IEdmModel a System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.' is thrown ( in src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs).

Assemblies affected

occurs at least in:

  • Microsoft.OpenApi.OData 1.7.4
  • Microsoft.OpenApi.OData 2.0.0 preview 8

Steps to reproduce

In an ODataController, add a dollar-count-similar operation, eg:

[HttpGet]
[Description("Shows the total count of entities")]
public async Task<IActionResult> Count()
{
    return await CountEntities();
}

Add the function to the ODataConventionModelBuilder, eg:
builder.EntityType<Entity>().Collection.Function(nameof(EntitiesController.Count)).Returns<int>();

Create the IEdmModel and call

var edmModel = odataBuilder.GetEdmModel();
var document = edmModel.ConvertToOpenApi();

Expected result

The OpenApiDocument gets created.

Actual result

System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.'
Following the StackTrace the reason is:
AppendBoundOperationOnNavigationSourcePath() has a foreach on IList, which calls AppendPath(newPath);, which results in a modification of the paths, if a dollar-count-similar path is found, hence resulting in the InvalidOperationException.

Additional detail

Creating a copy of the collection before iterating over it in ODataPathProvider.cs L950 would work in my use-case, but keeps the $count and Count() operations in the openapi specification. Don't know if that is a problem.

foreach (var subPath in value.ToList())
...

As a workaround - not using dollar-similar-paths in your OData operations removes the issue as well ;)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions