@@ -137,10 +137,11 @@ internal async Task<OpenApiSchema> GetOrCreateUnresolvedSchemaAsync(OpenApiDocum
137137 internal async Task < IOpenApiSchema > GetOrCreateSchemaAsync ( OpenApiDocument document , Type type , IServiceProvider scopedServiceProvider , IOpenApiSchemaTransformer [ ] schemaTransformers , ApiParameterDescription ? parameterDescription = null , CancellationToken cancellationToken = default )
138138 {
139139 var schema = await GetOrCreateUnresolvedSchemaAsync ( document , type , scopedServiceProvider , schemaTransformers , parameterDescription , cancellationToken ) ;
140- return ResolveReferenceForSchema ( document , schema ) ;
140+ var baseSchemaId = optionsMonitor . Get ( documentName ) . CreateSchemaReferenceId ( _jsonSerializerOptions . GetTypeInfo ( type ) ) ;
141+ return ResolveReferenceForSchema ( document , schema , baseSchemaId ) ;
141142 }
142143
143- internal static IOpenApiSchema ResolveReferenceForSchema ( OpenApiDocument document , IOpenApiSchema inputSchema , string ? baseSchemaId = null )
144+ internal static IOpenApiSchema ResolveReferenceForSchema ( OpenApiDocument document , IOpenApiSchema inputSchema , string ? rootSchemaId , string ? baseSchemaId = null )
144145 {
145146 var schema = UnwrapOpenApiSchema ( inputSchema ) ;
146147
@@ -151,7 +152,7 @@ internal static IOpenApiSchema ResolveReferenceForSchema(OpenApiDocument documen
151152 {
152153 for ( var i = 0 ; i < schema . AnyOf . Count ; i ++ )
153154 {
154- schema . AnyOf [ i ] = ResolveReferenceForSchema ( document , schema . AnyOf [ i ] , resolvedBaseSchemaId ? . ToString ( ) ) ;
155+ schema . AnyOf [ i ] = ResolveReferenceForSchema ( document , schema . AnyOf [ i ] , rootSchemaId , resolvedBaseSchemaId ? . ToString ( ) ) ;
155156 }
156157 }
157158 }
@@ -160,51 +161,56 @@ internal static IOpenApiSchema ResolveReferenceForSchema(OpenApiDocument documen
160161 {
161162 foreach ( var property in schema . Properties )
162163 {
163- schema . Properties [ property . Key ] = ResolveReferenceForSchema ( document , property . Value ) ;
164+ schema . Properties [ property . Key ] = ResolveReferenceForSchema ( document , property . Value , rootSchemaId ) ;
164165 }
165166 }
166167
167168 if ( schema . AllOf is { Count : > 0 } )
168169 {
169170 for ( var i = 0 ; i < schema . AllOf . Count ; i ++ )
170171 {
171- schema . AllOf [ i ] = ResolveReferenceForSchema ( document , schema . AllOf [ i ] ) ;
172+ schema . AllOf [ i ] = ResolveReferenceForSchema ( document , schema . AllOf [ i ] , rootSchemaId ) ;
172173 }
173174 }
174175
175176 if ( schema . OneOf is { Count : > 0 } )
176177 {
177178 for ( var i = 0 ; i < schema . OneOf . Count ; i ++ )
178179 {
179- schema . OneOf [ i ] = ResolveReferenceForSchema ( document , schema . OneOf [ i ] ) ;
180+ schema . OneOf [ i ] = ResolveReferenceForSchema ( document , schema . OneOf [ i ] , rootSchemaId ) ;
180181 }
181182 }
182183
183184 if ( schema . AdditionalProperties is not null )
184185 {
185- schema . AdditionalProperties = ResolveReferenceForSchema ( document , schema . AdditionalProperties ) ;
186+ schema . AdditionalProperties = ResolveReferenceForSchema ( document , schema . AdditionalProperties , rootSchemaId ) ;
186187 }
187188
188189 if ( schema . Items is not null )
189190 {
190- schema . Items = ResolveReferenceForSchema ( document , schema . Items ) ;
191+ schema . Items = ResolveReferenceForSchema ( document , schema . Items , rootSchemaId ) ;
191192 }
192193
193194 if ( schema . Not is not null )
194195 {
195- schema . Not = ResolveReferenceForSchema ( document , schema . Not ) ;
196+ schema . Not = ResolveReferenceForSchema ( document , schema . Not , rootSchemaId ) ;
196197 }
197198
198199 // Handle schemas where the references have been inlined by the JsonSchemaExporter. In this case,
199200 // the `#` ID is generated by the exporter since it has no base document to baseline against. In this
200201 // case we we want to replace the reference ID with the schema ID that was generated by the
201202 // `CreateSchemaReferenceId` method in the OpenApiSchemaService.
202203 if ( schema . Metadata is not null &&
203- schema . Metadata . ContainsKey ( OpenApiConstants . RefId ) &&
204- schema . Metadata . TryGetValue ( OpenApiConstants . SchemaId , out var schemaId ) &&
205- schemaId is string schemaIdString )
204+ schema . Metadata . TryGetValue ( OpenApiConstants . RefId , out var refId ) &&
205+ refId is string refIdString )
206206 {
207- return document . AddOpenApiSchemaByReference ( schemaIdString , schema ) ;
207+ if ( schema . Metadata . TryGetValue ( OpenApiConstants . SchemaId , out var schemaId ) &&
208+ schemaId is string schemaIdString )
209+ {
210+ return document . AddOpenApiSchemaByReference ( schemaIdString , schema ) ;
211+ }
212+ var relativeSchemaId = $ "#/components/schemas/{ rootSchemaId } { refIdString . Replace ( "#" , string . Empty ) } ";
213+ return new OpenApiSchemaReference ( relativeSchemaId , document ) ;
208214 }
209215
210216 // If we're resolving schemas for a top-level schema being referenced in the `components.schema` property
0 commit comments