Skip to content

fix: regression that limited discriminator mapping lookup#7507

Draft
MIchaelMainer wants to merge 3 commits intomainfrom
mmainer/fixDiscriminator
Draft

fix: regression that limited discriminator mapping lookup#7507
MIchaelMainer wants to merge 3 commits intomainfrom
mmainer/fixDiscriminator

Conversation

@MIchaelMainer
Copy link
Copy Markdown
Member

@MIchaelMainer MIchaelMainer commented Mar 20, 2026

Root Cause

GetDiscriminatorMappings in OpenApiSchemaExtensions.cs, when lookupKeyInParentMapping = true (set for oneOf/anyOf members), only looked one level up in the allOf chain for a discriminator mapping:

  schema.AllOf?.OfType<OpenApiSchemaReference>()
      .Select(static x => x.RecursiveTarget)
      .OfType<OpenApiSchema>()
      .FirstOrDefault(allOfEvaluatorForMappings)  // checks only the immediate parent

For a 3-level hierarchy like application → directoryObject (no discriminator) → entity (has discriminator):

  • It looked at directoryObject → no discriminator → returned null

  • Fell back to GetAllInheritanceSchemaReferences, returning "microsoft.graph.application" (plain schema name, without
    #)

  • The factory key "microsoft.graph.application" never matched the actual OData @odata.type value
    "#microsoft.graph.application" → factory fell back to DirectoryObject

  • validate with a generation run for all languages

  • run with 1.30, latest main, and fix branch

Fix

Added FindAncestorSchemaWithDiscriminatorMapping() which recursively traverses the entire allOf ancestry chain to find
the first ancestor with a discriminator mapping. The lookupKeyInParentMapping block now uses this instead of the
single-level lookup, so entity's discriminator (with the correct "#microsoft.graph.application" key) is found even
when directoryObject sits between application and entity.

@msgraph-bot msgraph-bot bot added this to Kiota Mar 20, 2026
gavinbarron and others added 2 commits March 23, 2026 08:47
Adds a test verifying that the Value property on a delta response
is typed as the concrete Application class, not the base DirectoryObject.
This guards against regressions where the value items type could be
resolved to an ancestor class instead of the declared schema type.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

2 participants