Skip to content

Fully integrate JSON mapping into the relational model#38038

Merged
AndriySvyryd merged 7 commits intomainfrom
RelationalModelJson
Apr 9, 2026
Merged

Fully integrate JSON mapping into the relational model#38038
AndriySvyryd merged 7 commits intomainfrom
RelationalModelJson

Conversation

@AndriySvyryd
Copy link
Copy Markdown
Member

Change partial update JSON path to be structured instead of a string JSONPATH

Fixes #36646
Fixes #32185

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR advances EF Core’s relational JSON support by modeling JSON elements (objects/arrays/scalars) directly in the relational model and by replacing string JSONPATH usage in partial updates with a structured JsonPath, enabling providers (e.g., PostgreSQL) to consume path components more flexibly.

Changes:

  • Introduces JsonPath/JsonPathSegment and updates JSON partial update SQL generation to use the structured path instead of a string.
  • Adds relational-model JSON element types (IRelationalJsonElement + object/array/scalar), JSON element mappings, and populates JSON element trees on JSON columns.
  • Extends FindColumn APIs to accept IPropertyBase (including navigations and complex properties) and updates compiled model/scaffolding baselines and tests accordingly.

Reviewed changes

Copilot reviewed 46 out of 47 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
test/EFCore.Tests/Infrastructure/JsonPathTest.cs Adds unit tests for JsonPath and JsonPathSegment formatting/behavior.
test/EFCore.SqlServer.FunctionalTests/Scaffolding/Baselines/ComplexTypes/DbContextModelBuilder.cs Updates scaffolding baseline to emit JSON element tree initialization.
test/EFCore.SqlServer.FunctionalTests/Scaffolding/Baselines/BigModel_with_JSON_columns/DbContextModelBuilder.cs Updates scaffolding baseline to emit JSON element tree initialization (big model).
test/EFCore.Sqlite.Tests/Migrations/SqliteMigrationAnnotationProviderTest.cs Adjusts test for updated column mapping typing and removes BOM.
test/EFCore.Sqlite.FunctionalTests/Scaffolding/Baselines/BigModel_with_JSON_columns/DbContextModelBuilder.cs Updates scaffolding baseline to emit JSON element tree initialization (SQLite).
test/EFCore.Relational.Tests/Metadata/RelationalModelTest.cs Adds tests asserting JSON element trees/mappings and FindColumn behavior.
test/EFCore.Relational.Specification.Tests/Scaffolding/CompiledModelRelationalTestBase.cs Adds assertions around JSON element metadata in compiled model scenarios.
src/EFCore/Infrastructure/JsonPathSegment.cs Introduces structured JSON path segment (property vs array placeholder).
src/EFCore/Infrastructure/JsonPath.cs Introduces structured JSON path (segments + ordinals) with formatting helpers.
src/EFCore.SqlServer/Update/Internal/SqlServerUpdateSqlGenerator.cs Uses JsonPath.AppendTo and structured root detection for JSON updates.
src/EFCore.SqlServer/Query/Internal/SqlServerQueryableMethodTranslatingExpressionVisitor.cs Switches JSON container column lookup to FindColumn.
src/EFCore.Sqlite.Core/Update/Internal/SqliteUpdateSqlGenerator.cs Uses JsonPath.AppendTo and structured root detection for JSON updates.
src/EFCore.Relational/Update/ModificationCommand.cs Builds structured JsonPath for JSON partial updates using element metadata/mappings.
src/EFCore.Relational/Update/IColumnModification.cs Changes JsonPath from string to JsonPath?.
src/EFCore.Relational/Update/ColumnModificationParameters.cs Changes JsonPath from string to JsonPath? and updates ctor signature.
src/EFCore.Relational/Update/ColumnModification.cs Changes JsonPath from string to JsonPath?.
src/EFCore.Relational/Query/RelationalQueryableMethodTranslatingExpressionVisitor.ExecuteUpdate.cs Updates container column resolution to FindColumn with null handling.
src/EFCore.Relational/Metadata/RelationalAnnotationNames.cs Adds JsonElementMappings annotation name.
src/EFCore.Relational/Metadata/JsonValueType.cs Adds enum to capture scalar JSON value kind.
src/EFCore.Relational/Metadata/IView.cs Broadens FindColumn parameter type to IPropertyBase.
src/EFCore.Relational/Metadata/ITableBase.cs Broadens FindColumn parameter type to IPropertyBase.
src/EFCore.Relational/Metadata/ITable.cs Broadens FindColumn parameter type to IPropertyBase.
src/EFCore.Relational/Metadata/IStoreFunction.cs Broadens FindColumn parameter type to IPropertyBase.
src/EFCore.Relational/Metadata/ISqlQuery.cs Broadens FindColumn parameter type to IPropertyBase.
src/EFCore.Relational/Metadata/IRelationalJsonScalar.cs Adds public interface for scalar JSON elements.
src/EFCore.Relational/Metadata/IRelationalJsonObject.cs Adds public interface for object JSON elements.
src/EFCore.Relational/Metadata/IRelationalJsonElement.cs Adds public interface for JSON elements (name/path/column/mappings).
src/EFCore.Relational/Metadata/IRelationalJsonArray.cs Adds public interface for array JSON elements.
src/EFCore.Relational/Metadata/Internal/View.cs Implements FindColumn(IPropertyBase) with navigation/complex-property support.
src/EFCore.Relational/Metadata/Internal/TableBase.cs Implements FindColumn(IPropertyBase) with navigation/complex-property support.
src/EFCore.Relational/Metadata/Internal/Table.cs Implements FindColumn(IPropertyBase) with navigation/complex-property support.
src/EFCore.Relational/Metadata/Internal/StoreStoredProcedure.cs Updates FindColumn override for broadened IPropertyBase signature.
src/EFCore.Relational/Metadata/Internal/StoreFunction.cs Updates FindColumn override for broadened IPropertyBase signature.
src/EFCore.Relational/Metadata/Internal/SqlQuery.cs Updates FindColumn override for broadened IPropertyBase signature.
src/EFCore.Relational/Metadata/Internal/RelationalModel.cs Builds JSON element trees, adds JSON element mappings, and sets JsonElement on JSON columns.
src/EFCore.Relational/Metadata/Internal/RelationalJsonScalar.cs Implements internal scalar JSON element.
src/EFCore.Relational/Metadata/Internal/RelationalJsonObject.cs Implements internal object JSON element with ordered properties.
src/EFCore.Relational/Metadata/Internal/RelationalJsonElement.cs Implements internal base type for JSON elements (path/nullable/mappings).
src/EFCore.Relational/Metadata/Internal/RelationalJsonArray.cs Implements internal array JSON element with element-type linkage.
src/EFCore.Relational/Metadata/Internal/JsonElementMapping.cs Implements internal mapping between model property and JSON element.
src/EFCore.Relational/Metadata/Internal/ColumnBase.cs Adds JsonElement property slot to columns.
src/EFCore.Relational/Metadata/IJsonElementMapping.cs Adds public interface for property-to-JSON-element mappings.
src/EFCore.Relational/Metadata/IColumnBase.cs Exposes JsonElement on columns (default null for non-JSON columns).
src/EFCore.Relational/Metadata/Conventions/RelationalRuntimeModelConvention.cs Removes JSON element mapping annotations from runtime annotations dictionary (consistent with other mapping annotations).
src/EFCore.Relational/Extensions/RelationalPropertyExtensions.cs Generalizes mapping accessors to IPropertyBase and adds GetJsonElementMappings().
src/EFCore.Relational/Design/Internal/RelationalCSharpRuntimeAnnotationCodeGenerator.cs Emits compiled-model code to recreate JSON element trees on columns.

@AndriySvyryd AndriySvyryd force-pushed the RelationalModelJson branch from 92c7cbb to 3f990fc Compare April 2, 2026 01:21
@AndriySvyryd AndriySvyryd marked this pull request as ready for review April 2, 2026 01:22
@AndriySvyryd AndriySvyryd requested a review from a team as a code owner April 2, 2026 01:22
Copilot AI review requested due to automatic review settings April 2, 2026 01:22
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 47 out of 49 changed files in this pull request and generated 5 comments.

Files not reviewed (1)
  • src/EFCore/Properties/CoreStrings.Designer.cs: Language not supported

Copy link
Copy Markdown
Member

@roji roji left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's a first review @AndriySvyryd.

  • From this PR specifically it's difficult to see the immediate, concrete value (in terms of simplifying/improving code in update/query). Are you planning more significant work on update (since the current changes seem minimal and slightly orthogonal too)?
  • I'm noting that we're kinda redoing a version of JSON Schema here, though we have our own concerns (our model is fully traversable in all directions, contains mapping to IPropertyBase...).
  • I'd want to understand why JSON scalars have a only string/number/bool typing, as opposed to our full known type mapping.
  • Ideally we'd have JSON-mapped primitive collections using the same JSON modeling in the relational model, what do you think?
  • I can't help but think of other non-JSON document-style mappings (e.g. PG arrays, composite types...). Since the relational model isn't extensible (I think?), the PG provider can't integrate that into the relational model and has to make do with the current way. Which maybe raises the question of how useful/necessary JSON modeling really is in the relational model... We can discuss.

@roji roji assigned AndriySvyryd and unassigned roji Apr 5, 2026
@AndriySvyryd
Copy link
Copy Markdown
Member Author

From this PR specifically it's difficult to see the immediate, concrete value (in terms of simplifying/improving code in update/query). Are you planning more significant work on update (since the current changes seem minimal and slightly orthogonal too)?

This will be used when implementing the features linked from #36646. Currently it indeed doesn't reduce much of the complexity because we only support simple JSON mappings.

I'd want to understand why JSON scalars have a only string/number/bool typing, as opposed to our full known type mapping.

Those are all the possible JSON scalar types, I'm not sure yet whether this property will be useful, only adding it for completeness. You can get the type mapping from the property mapping.

Ideally we'd have JSON-mapped primitive collections using the same JSON modeling in the relational model, what do you think?

Sure, though I'm not sure yet how it would be used

I can't help but think of other non-JSON document-style mappings (e.g. PG arrays, composite types...). Since the relational model isn't extensible (I think?), the PG provider can't integrate that into the relational model and has to make do with the current way. Which maybe raises the question of how useful/necessary JSON modeling really is in the relational model... We can discuss.

It's extensible in the same way as the regular model - everything is IAnnotatable

@AndriySvyryd AndriySvyryd added the api-review This PR or issue is introducing public API changes that need to be reviewed label Apr 7, 2026
@AndriySvyryd AndriySvyryd assigned roji and unassigned AndriySvyryd Apr 7, 2026
Copilot AI review requested due to automatic review settings April 7, 2026 05:21
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 47 out of 49 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • src/EFCore/Properties/CoreStrings.Designer.cs: Language not supported

@roji
Copy link
Copy Markdown
Member

roji commented Apr 7, 2026

I'd want to understand why JSON scalars have a only string/number/bool typing, as opposed to our full known type mapping.

Those are all the possible JSON scalar types, I'm not sure yet whether this property will be useful, only adding it for completeness. You can get the type mapping from the property mapping.

Then maybe introduce this later based on need, rather than up-front for completeness?

I can't help but think of other non-JSON document-style mappings (e.g. PG arrays, composite types...). Since the relational model isn't extensible (I think?), the PG provider can't integrate that into the relational model and has to make do with the current way. Which maybe raises the question of how useful/necessary JSON modeling really is in the relational model... We can discuss.

It's extensible in the same way as the regular model - everything is IAnnotatable

But isn't the creation of the relational model all in private static methods in RelationalModel.cs? How would I go about adding new things (or even tweaking existing things)?

@roji roji removed the needs-design label Apr 7, 2026
Change partial update JSON path to be structured instead of a string JSONPATH

Fixes #36646
Fixes #32185
@AndriySvyryd AndriySvyryd force-pushed the RelationalModelJson branch from c14353a to 2315125 Compare April 8, 2026 17:26
Copilot AI review requested due to automatic review settings April 8, 2026 17:28
@AndriySvyryd AndriySvyryd force-pushed the RelationalModelJson branch from 2315125 to 6b035db Compare April 8, 2026 17:28
SELECT "o0"."OwnedReferenceLeaf" ->> 'SomethingSomething' AS "c", "o0"."Date"
FROM (
SELECT "o"."value" ->> 'Date' AS "Date", "o"."value" ->> 'Enum' AS "Enum", "o"."value" ->> 'Fraction' AS "Fraction", "o"."value" ->> 'Id' AS "Id", "o"."value" ->> 'OwnedReferenceLeaf' AS "OwnedReferenceLeaf"
SELECT "o"."value" ->> 'Date' AS "Date", "o"."value" ->> 'OwnedReferenceLeaf' AS "OwnedReferenceLeaf"
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@roji Should we be at all concerned about this change or just count it as a win?

@AndriySvyryd AndriySvyryd enabled auto-merge (squash) April 8, 2026 17:31
@AndriySvyryd AndriySvyryd disabled auto-merge April 8, 2026 17:35
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 54 out of 57 changed files in this pull request and generated 3 comments.

Files not reviewed (1)
  • src/EFCore/Properties/CoreStrings.Designer.cs: Language not supported

Copilot AI review requested due to automatic review settings April 8, 2026 20:15
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 53 out of 58 changed files in this pull request and generated 2 comments.

Files not reviewed (1)
  • src/EFCore/Properties/CoreStrings.Designer.cs: Language not supported

Copilot AI review requested due to automatic review settings April 8, 2026 20:38
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 53 out of 58 changed files in this pull request and generated 1 comment.

Files not reviewed (1)
  • src/EFCore/Properties/CoreStrings.Designer.cs: Language not supported

@AndriySvyryd AndriySvyryd merged commit 695b5ad into main Apr 9, 2026
15 checks passed
@AndriySvyryd AndriySvyryd deleted the RelationalModelJson branch April 9, 2026 18:00
@github-actions
Copy link
Copy Markdown
Contributor

API review baseline changes

This PR modified one or more *.baseline.json files. The deltas below were generated by ApiChief between the base and selected PR versions.

src/EFCore.Relational/EFCore.Relational.baseline.json

Show delta
{
  "Name": "Microsoft.EntityFrameworkCore.Relational",
  "Types": [
    {
      "Type": "class Microsoft.EntityFrameworkCore.Update.ColumnModification : Microsoft.EntityFrameworkCore.Update.IColumnModification",
      "Methods": [
        {
          "Member": "ColumnModification.ColumnModification(in ColumnModificationParameters columnModificationParameters);"
        },
        {
          "Member": "virtual void ColumnModification.AddSharedColumnModification(IColumnModification modification);"
        },
        {
          "Member": "static object? ColumnModification.GetCurrentProviderValue(IUpdateEntry entry, IProperty property);"
        },
        {
          "Member": "static object? ColumnModification.GetCurrentValue(IUpdateEntry entry, IProperty property);"
        },
        {
          "Member": "static object? ColumnModification.GetOriginalProviderValue(IUpdateEntry entry, IProperty property);"
        },
        {
          "Member": "static object? ColumnModification.GetOriginalValue(IUpdateEntry entry, IProperty property);"
        },
        {
          "Member": "static bool ColumnModification.IsModified(IUpdateEntry entry, IProperty property);"
        },
        {
          "Member": "static bool ColumnModification.IsStoreGenerated(IUpdateEntry entry, IProperty property);"
        },
        {
          "Member": "virtual void ColumnModification.ResetParameterNames();"
        },
        {
          "Member": "static void ColumnModification.SetStoreGeneratedValue(IUpdateEntry entry, IProperty property, object? value);"
        }
      ],
      "Properties": [
        {
          "Member": "virtual IColumnBase? ColumnModification.Column { get; }"
        },
        {
          "Member": "virtual string ColumnModification.ColumnName { get; }"
        },
        {
          "Member": "virtual string? ColumnModification.ColumnType { get; }"
        },
        {
          "Member": "virtual IUpdateEntry? ColumnModification.Entry { get; }"
        },
        {
          "Member": "virtual bool ColumnModification.IsCondition { get; set; }"
        },
        {
          "Member": "virtual bool ColumnModification.IsKey { get; set; }"
        },
        {
          "Member": "virtual bool? ColumnModification.IsNullable { get; }"
        },
        {
          "Member": "virtual bool ColumnModification.IsRead { get; set; }"
        },
        {
          "Member": "virtual bool ColumnModification.IsWrite { get; set; }"
        },
        {
          "Member": "virtual string? ColumnModification.OriginalParameterName { get; }"
        },
        {
          "Member": "virtual object? ColumnModification.OriginalValue { get; set; }"
        },
        {
          "Member": "virtual string? ColumnModification.ParameterName { get; }"
        },
        {
          "Member": "virtual IProperty? ColumnModification.Property { get; }"
        },
        {
          "Member": "virtual RelationalTypeMapping? ColumnModification.TypeMapping { get; }"
        },
        {
          "Member": "virtual bool ColumnModification.UseCurrentValue { get; }"
        },
        {
          "Member": "virtual bool ColumnModification.UseCurrentValueParameter { get; }"
        },
        {
          "Member": "virtual bool ColumnModification.UseOriginalValue { get; }"
        },
        {
          "Member": "virtual bool ColumnModification.UseOriginalValueParameter { get; }"
        },
        {
          "Member": "virtual bool ColumnModification.UseParameter { get; }"
        },
        {
          "Member": "virtual object? ColumnModification.Value { get; set; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Properties": [
          {
            "Member": "virtual JsonPath? ColumnModification.JsonPath { get; }"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Properties": [
          {
            "Member": "virtual string? ColumnModification.JsonPath { get; }"
          }
        ]
      }
    },
    {
      "Type": "readonly class Microsoft.EntityFrameworkCore.Update.ColumnModificationParameters",
      "Methods": [
        {
          "Member": "ColumnModificationParameters.ColumnModificationParameters(string columnName, object? originalValue, object? value, IProperty? property, string? columnType, RelationalTypeMapping? typeMapping, bool read, bool write, bool key, bool condition, bool sensitiveLoggingEnabled, bool? isNullable = null);"
        },
        {
          "Member": "ColumnModificationParameters.ColumnModificationParameters(IColumn column, object? originalValue, object? value, IProperty? property, RelationalTypeMapping? typeMapping, bool read, bool write, bool key, bool condition, bool sensitiveLoggingEnabled, bool? isNullable = null);"
        },
        {
          "Member": "ColumnModificationParameters.ColumnModificationParameters(IUpdateEntry? entry, IProperty? property, IColumnBase column, Func<string> generateParameterName, RelationalTypeMapping typeMapping, bool valueIsRead, bool valueIsWrite, bool columnIsKey, bool columnIsCondition, bool sensitiveLoggingEnabled);"
        },
        {
          "Member": "ColumnModificationParameters.ColumnModificationParameters();"
        },
        {
          "Member": "override bool ColumnModificationParameters.Equals(object obj);"
        },
        {
          "Member": "bool ColumnModificationParameters.Equals(ColumnModificationParameters other);"
        },
        {
          "Member": "override int ColumnModificationParameters.GetHashCode();"
        },
        {
          "Member": "static bool operator ==(ColumnModificationParameters left, ColumnModificationParameters right);"
        },
        {
          "Member": "static bool operator !=(ColumnModificationParameters left, ColumnModificationParameters right);"
        },
        {
          "Member": "override string ColumnModificationParameters.ToString();"
        }
      ],
      "Properties": [
        {
          "Member": "IColumnBase? ColumnModificationParameters.Column { get; init; }"
        },
        {
          "Member": "string ColumnModificationParameters.ColumnName { get; init; }"
        },
        {
          "Member": "string? ColumnModificationParameters.ColumnType { get; init; }"
        },
        {
          "Member": "IUpdateEntry? ColumnModificationParameters.Entry { get; init; }"
        },
        {
          "Member": "Func<string>? ColumnModificationParameters.GenerateParameterName { get; init; }"
        },
        {
          "Member": "bool ColumnModificationParameters.IsCondition { get; init; }"
        },
        {
          "Member": "bool ColumnModificationParameters.IsKey { get; init; }"
        },
        {
          "Member": "bool? ColumnModificationParameters.IsNullable { get; init; }"
        },
        {
          "Member": "bool ColumnModificationParameters.IsRead { get; init; }"
        },
        {
          "Member": "bool ColumnModificationParameters.IsWrite { get; init; }"
        },
        {
          "Member": "object? ColumnModificationParameters.OriginalValue { get; init; }"
        },
        {
          "Member": "IProperty? ColumnModificationParameters.Property { get; init; }"
        },
        {
          "Member": "bool ColumnModificationParameters.SensitiveLoggingEnabled { get; init; }"
        },
        {
          "Member": "RelationalTypeMapping? ColumnModificationParameters.TypeMapping { get; init; }"
        },
        {
          "Member": "object? ColumnModificationParameters.Value { get; init; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "ColumnModificationParameters.ColumnModificationParameters(string columnName, object? value, IProperty? property, string? columnType, RelationalTypeMapping? typeMapping, JsonPath jsonPath, bool read, bool write, bool key, bool condition, bool sensitiveLoggingEnabled, bool? isNullable = null);"
          }
        ],
        "Properties": [
          {
            "Member": "JsonPath? ColumnModificationParameters.JsonPath { get; init; }"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "ColumnModificationParameters.ColumnModificationParameters(string columnName, object? value, IProperty? property, string? columnType, RelationalTypeMapping? typeMapping, string jsonPath, bool read, bool write, bool key, bool condition, bool sensitiveLoggingEnabled, bool? isNullable = null);"
          }
        ],
        "Properties": [
          {
            "Member": "string? ColumnModificationParameters.JsonPath { get; init; }"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.IColumnBase : Microsoft.EntityFrameworkCore.Infrastructure.IAnnotatable, Microsoft.EntityFrameworkCore.Infrastructure.IReadOnlyAnnotatable",
      "Methods": [
        {
          "Member": "IColumnMappingBase? IColumnBase.FindColumnMapping(IReadOnlyEntityType entityType);"
        },
        {
          "Member": "string IColumnBase.ToDebugString(MetadataDebugStringOptions options = Microsoft.EntityFrameworkCore.Infrastructure.MetadataDebugStringOptions.ShortDefault, int indent = 0);"
        }
      ],
      "Properties": [
        {
          "Member": "bool IColumnBase.IsNullable { get; }"
        },
        {
          "Member": "string IColumnBase.Name { get; }"
        },
        {
          "Member": "IReadOnlyList<IColumnMappingBase> IColumnBase.PropertyMappings { get; }"
        },
        {
          "Member": "Type IColumnBase.ProviderClrType { get; }"
        },
        {
          "Member": "ValueComparer IColumnBase.ProviderValueComparer { get; }"
        },
        {
          "Member": "string IColumnBase.StoreType { get; }"
        },
        {
          "Member": "RelationalTypeMapping IColumnBase.StoreTypeMapping { get; }"
        },
        {
          "Member": "ITableBase IColumnBase.Table { get; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Properties": [
          {
            "Member": "IRelationalJsonElement? IColumnBase.JsonElement { get; }"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Update.IColumnModification",
      "Methods": [
        {
          "Member": "void IColumnModification.AddSharedColumnModification(IColumnModification modification);"
        },
        {
          "Member": "void IColumnModification.ResetParameterNames();"
        }
      ],
      "Properties": [
        {
          "Member": "IColumnBase? IColumnModification.Column { get; }"
        },
        {
          "Member": "string IColumnModification.ColumnName { get; }"
        },
        {
          "Member": "string? IColumnModification.ColumnType { get; }"
        },
        {
          "Member": "IUpdateEntry? IColumnModification.Entry { get; }"
        },
        {
          "Member": "bool IColumnModification.IsCondition { get; set; }"
        },
        {
          "Member": "bool IColumnModification.IsKey { get; set; }"
        },
        {
          "Member": "bool? IColumnModification.IsNullable { get; }"
        },
        {
          "Member": "bool IColumnModification.IsRead { get; set; }"
        },
        {
          "Member": "bool IColumnModification.IsWrite { get; set; }"
        },
        {
          "Member": "string? IColumnModification.OriginalParameterName { get; }"
        },
        {
          "Member": "object? IColumnModification.OriginalValue { get; set; }"
        },
        {
          "Member": "string? IColumnModification.ParameterName { get; }"
        },
        {
          "Member": "IProperty? IColumnModification.Property { get; }"
        },
        {
          "Member": "RelationalTypeMapping? IColumnModification.TypeMapping { get; }"
        },
        {
          "Member": "bool IColumnModification.UseCurrentValue { get; }"
        },
        {
          "Member": "bool IColumnModification.UseCurrentValueParameter { get; }"
        },
        {
          "Member": "bool IColumnModification.UseOriginalValue { get; }"
        },
        {
          "Member": "bool IColumnModification.UseOriginalValueParameter { get; }"
        },
        {
          "Member": "bool IColumnModification.UseParameter { get; }"
        },
        {
          "Member": "object? IColumnModification.Value { get; set; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Properties": [
          {
            "Member": "JsonPath? IColumnModification.JsonPath { get; }"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Properties": [
          {
            "Member": "string? IColumnModification.JsonPath { get; }"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.IJsonElementMapping",
      "Additions": {
        "Type": "",
        "Properties": [
          {
            "Member": "IRelationalJsonElement IJsonElementMapping.Element { get; }"
          },
          {
            "Member": "IPropertyBase IJsonElementMapping.Property { get; }"
          },
          {
            "Member": "ITableMappingBase IJsonElementMapping.TableMapping { get; }"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.IRelationalJsonArray : Microsoft.EntityFrameworkCore.Metadata.IRelationalJsonElement",
      "Additions": {
        "Type": "",
        "Properties": [
          {
            "Member": "IRelationalJsonElement IRelationalJsonArray.ElementType { get; }"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.IRelationalJsonElement",
      "Additions": {
        "Type": "",
        "Properties": [
          {
            "Member": "IColumnBase IRelationalJsonElement.ContainingColumn { get; }"
          },
          {
            "Member": "bool IRelationalJsonElement.IsNullable { get; }"
          },
          {
            "Member": "IRelationalJsonElement? IRelationalJsonElement.ParentElement { get; }"
          },
          {
            "Member": "IReadOnlyList<JsonPathSegment> IRelationalJsonElement.Path { get; }"
          },
          {
            "Member": "IReadOnlyList<IJsonElementMapping> IRelationalJsonElement.PropertyMappings { get; }"
          },
          {
            "Member": "string? IRelationalJsonElement.PropertyName { get; }"
          },
          {
            "Member": "RelationalTypeMapping? IRelationalJsonElement.StoreTypeMapping { get; }"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.IRelationalJsonObject : Microsoft.EntityFrameworkCore.Metadata.IRelationalJsonElement",
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "IRelationalJsonElement? IRelationalJsonObject.FindProperty(string name);"
          }
        ],
        "Properties": [
          {
            "Member": "IReadOnlyList<IRelationalJsonElement> IRelationalJsonObject.Properties { get; }"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.ISqlQuery : Microsoft.EntityFrameworkCore.Metadata.ITableBase, Microsoft.EntityFrameworkCore.Infrastructure.IAnnotatable, Microsoft.EntityFrameworkCore.Infrastructure.IReadOnlyAnnotatable",
      "Methods": [
        {
          "Member": "ISqlQueryColumn? ISqlQuery.FindColumn(string name);"
        }
      ],
      "Properties": [
        {
          "Member": "IEnumerable<ISqlQueryColumn> ISqlQuery.Columns { get; }"
        },
        {
          "Member": "IEnumerable<ISqlQueryMapping> ISqlQuery.EntityTypeMappings { get; }"
        },
        {
          "Member": "string ISqlQuery.Sql { get; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "ISqlQueryColumn? ISqlQuery.FindColumn(IPropertyBase propertyBase);"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "ISqlQueryColumn? ISqlQuery.FindColumn(IProperty property);"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.IStoreFunction : Microsoft.EntityFrameworkCore.Metadata.ITableBase, Microsoft.EntityFrameworkCore.Infrastructure.IAnnotatable, Microsoft.EntityFrameworkCore.Infrastructure.IReadOnlyAnnotatable",
      "Methods": [
        {
          "Member": "IFunctionColumn? IStoreFunction.FindColumn(string name);"
        }
      ],
      "Properties": [
        {
          "Member": "IEnumerable<IFunctionColumn> IStoreFunction.Columns { get; }"
        },
        {
          "Member": "IEnumerable<IDbFunction> IStoreFunction.DbFunctions { get; }"
        },
        {
          "Member": "IEnumerable<IFunctionMapping> IStoreFunction.EntityTypeMappings { get; }"
        },
        {
          "Member": "bool IStoreFunction.IsBuiltIn { get; }"
        },
        {
          "Member": "IEnumerable<IStoreFunctionParameter> IStoreFunction.Parameters { get; }"
        },
        {
          "Member": "string? IStoreFunction.ReturnType { get; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "IFunctionColumn? IStoreFunction.FindColumn(IPropertyBase propertyBase);"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "IFunctionColumn? IStoreFunction.FindColumn(IProperty property);"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.ITable : Microsoft.EntityFrameworkCore.Metadata.ITableBase, Microsoft.EntityFrameworkCore.Infrastructure.IAnnotatable, Microsoft.EntityFrameworkCore.Infrastructure.IReadOnlyAnnotatable",
      "Methods": [
        {
          "Member": "IColumn? ITable.FindColumn(string name);"
        }
      ],
      "Properties": [
        {
          "Member": "IEnumerable<ICheckConstraint> ITable.CheckConstraints { get; }"
        },
        {
          "Member": "IEnumerable<IColumn> ITable.Columns { get; }"
        },
        {
          "Member": "string? ITable.Comment { get; }"
        },
        {
          "Member": "IEnumerable<ITableMapping> ITable.EntityTypeMappings { get; }"
        },
        {
          "Member": "IEnumerable<IForeignKeyConstraint> ITable.ForeignKeyConstraints { get; }"
        },
        {
          "Member": "IEnumerable<ITableIndex> ITable.Indexes { get; }"
        },
        {
          "Member": "bool ITable.IsExcludedFromMigrations { get; }"
        },
        {
          "Member": "IPrimaryKeyConstraint? ITable.PrimaryKey { get; }"
        },
        {
          "Member": "IEnumerable<IForeignKeyConstraint> ITable.ReferencingForeignKeyConstraints { get; }"
        },
        {
          "Member": "IEnumerable<ITrigger> ITable.Triggers { get; }"
        },
        {
          "Member": "IEnumerable<IUniqueConstraint> ITable.UniqueConstraints { get; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "IColumn? ITable.FindColumn(IPropertyBase propertyBase);"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "IColumn? ITable.FindColumn(IProperty property);"
          }
        ]
      }
    },
    {
      "Type": "interface Microsoft.EntityFrameworkCore.Metadata.ITableBase : Microsoft.EntityFrameworkCore.Infrastructure.IAnnotatable, Microsoft.EntityFrameworkCore.Infrastructure.IReadOnlyAnnotatable",
      "Methods": [
        {
          "Member": "IColumnBase? ITableBase.FindColumn(string name);"
        },
        {
          "Member": "IEnumerable<IForeignKey> ITableBase.GetR
... (truncated)

src/EFCore.SqlServer/EFCore.SqlServer.baseline.json

Show delta
{
  "Name": "Microsoft.EntityFrameworkCore.SqlServer",
  "Types": [
    {
      "Type": "readonly struct Microsoft.EntityFrameworkCore.Query.FullTextSearchResult<TKey>",
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "FullTextSearchResult<TKey>.FullTextSearchResult(TKey key, int rank);"
          },
          {
            "Member": "FullTextSearchResult<TKey>.FullTextSearchResult();"
          },
          {
            "Member": "void FullTextSearchResult<TKey>.Deconstruct(out TKey key, out int rank);"
          }
        ],
        "Properties": [
          {
            "Member": "TKey FullTextSearchResult<TKey>.Key { get; }"
          },
          {
            "Member": "int FullTextSearchResult<TKey>.Rank { get; }"
          }
        ]
      }
    },
    {
      "Type": "class Microsoft.EntityFrameworkCore.Metadata.Builders.SqlServerFullTextIndexBuilder(Microsoft.EntityFrameworkCore.Metadata.Builders.IndexBuilder indexBuilder)",
      "Methods": [
        {
          "Member": "SqlServerFullTextIndexBuilder.SqlServerFullTextIndexBuilder(IndexBuilder indexBuilder);"
        },
        {
          "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.HasDatabaseName(string? name);"
        }
      ],
      "Properties": [
        {
          "Member": "virtual IMutableIndex SqlServerFullTextIndexBuilder.Metadata { get; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.HasChangeTracking(FullTextChangeTracking changeTracking);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.UseCatalog(string catalog);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.UseKeyIndex(string keyIndex);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.UseLanguage(string propertyName, string language);"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.HasKeyIndex(string keyIndexName);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.HasLanguage(string propertyName, string language);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.OnCatalog(string catalogName);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder SqlServerFullTextIndexBuilder.WithChangeTracking(FullTextChangeTracking changeTracking);"
          }
        ]
      }
    },
    {
      "Type": "class Microsoft.EntityFrameworkCore.Metadata.Builders.SqlServerFullTextIndexBuilder<TEntity>(Microsoft.EntityFrameworkCore.Metadata.Builders.IndexBuilder<TEntity> indexBuilder)",
      "Methods": [
        {
          "Member": "SqlServerFullTextIndexBuilder<TEntity>.SqlServerFullTextIndexBuilder(IndexBuilder<TEntity> indexBuilder);"
        },
        {
          "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.HasDatabaseName(string? name);"
        }
      ],
      "Properties": [
        {
          "Member": "virtual IMutableIndex SqlServerFullTextIndexBuilder<TEntity>.Metadata { get; }"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.HasChangeTracking(FullTextChangeTracking changeTracking);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.UseCatalog(string catalog);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.UseKeyIndex(string keyIndex);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.UseLanguage(string propertyName, string language);"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.HasKeyIndex(string keyIndexName);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.HasLanguage(string propertyName, string language);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.OnCatalog(string catalogName);"
          },
          {
            "Member": "virtual SqlServerFullTextIndexBuilder<TEntity> SqlServerFullTextIndexBuilder<TEntity>.WithChangeTracking(FullTextChangeTracking changeTracking);"
          }
        ]
      }
    },
    {
      "Type": "static class Microsoft.EntityFrameworkCore.SqlServerIndexBuilderExtensions",
      "Methods": [
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetDataCompression(this IConventionIndexBuilder indexBuilder, DataCompressionType? dataCompressionType, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetFillFactor(this IConventionIndexBuilder indexBuilder, int? fillFactor, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetFullTextChangeTracking(this IConventionIndexBuilder indexBuilder, FullTextChangeTracking? changeTracking, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetFullTextLanguages(this IConventionIndexBuilder indexBuilder, IReadOnlyDictionary<string, string>? languages, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetIncludeProperties(this IConventionIndexBuilder indexBuilder, IReadOnlyList<string>? propertyNames, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetIsClustered(this IConventionIndexBuilder indexBuilder, bool? clustered, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetIsCreatedOnline(this IConventionIndexBuilder indexBuilder, bool? createdOnline, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static bool SqlServerIndexBuilderExtensions.CanSetSortInTempDb(this IConventionIndexBuilder indexBuilder, bool? sortInTempDb, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.HasFillFactor(this IndexBuilder indexBuilder, int fillFactor);"
        },
        {
          "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.HasFillFactor<TEntity>(this IndexBuilder<TEntity> indexBuilder, int fillFactor);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.HasFillFactor(this IConventionIndexBuilder indexBuilder, int? fillFactor, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.HasFullTextChangeTracking(this IConventionIndexBuilder indexBuilder, FullTextChangeTracking? changeTracking, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.HasFullTextLanguages(this IConventionIndexBuilder indexBuilder, IReadOnlyDictionary<string, string>? languages, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.IncludeProperties(this IndexBuilder indexBuilder, params string[] propertyNames);"
        },
        {
          "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.IncludeProperties<TEntity>(this IndexBuilder<TEntity> indexBuilder, params string[] propertyNames);"
        },
        {
          "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.IncludeProperties<TEntity>(this IndexBuilder<TEntity> indexBuilder, Expression<Func<TEntity, object?>> includeExpression);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.IncludeProperties(this IConventionIndexBuilder indexBuilder, IReadOnlyList<string>? propertyNames, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.IsClustered(this IndexBuilder indexBuilder, bool clustered = true);"
        },
        {
          "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.IsClustered<TEntity>(this IndexBuilder<TEntity> indexBuilder, bool clustered = true);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.IsClustered(this IConventionIndexBuilder indexBuilder, bool? clustered, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.IsCreatedOnline(this IndexBuilder indexBuilder, bool createdOnline = true);"
        },
        {
          "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.IsCreatedOnline<TEntity>(this IndexBuilder<TEntity> indexBuilder, bool createdOnline = true);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.IsCreatedOnline(this IConventionIndexBuilder indexBuilder, bool? createdOnline, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.SortInTempDb(this IndexBuilder indexBuilder, bool sortInTempDb = true);"
        },
        {
          "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.SortInTempDb<TEntity>(this IndexBuilder<TEntity> indexBuilder, bool sortInTempDb = true);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.SortInTempDb(this IConventionIndexBuilder indexBuilder, bool? sortInTempDb, bool fromDataAnnotation = false);"
        },
        {
          "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.UseDataCompression(this IndexBuilder indexBuilder, DataCompressionType dataCompressionType);"
        },
        {
          "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.UseDataCompression<TEntity>(this IndexBuilder<TEntity> indexBuilder, DataCompressionType dataCompressionType);"
        },
        {
          "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.UseDataCompression(this IConventionIndexBuilder indexBuilder, DataCompressionType? dataCompressionType, bool fromDataAnnotation = false);"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "static bool SqlServerIndexBuilderExtensions.CanSetFullTextCatalog(this IConventionIndexBuilder indexBuilder, string? catalog, bool fromDataAnnotation = false);"
          },
          {
            "Member": "static bool SqlServerIndexBuilderExtensions.CanSetFullTextKeyIndex(this IConventionIndexBuilder indexBuilder, string? keyIndex, bool fromDataAnnotation = false);"
          },
          {
            "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.HasFullTextCatalog(this IConventionIndexBuilder indexBuilder, string? catalog, bool fromDataAnnotation = false);"
          },
          {
            "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.HasFullTextKeyIndex(this IConventionIndexBuilder indexBuilder, string? keyIndex, bool fromDataAnnotation = false);"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "static bool SqlServerIndexBuilderExtensions.CanSetFullTextCatalog(this IConventionIndexBuilder indexBuilder, string? catalogName, bool fromDataAnnotation = false);"
          },
          {
            "Member": "static bool SqlServerIndexBuilderExtensions.CanSetFullTextKeyIndex(this IConventionIndexBuilder indexBuilder, string? keyIndexName, bool fromDataAnnotation = false);"
          },
          {
            "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.HasFullTextCatalog(this IndexBuilder indexBuilder, string catalogName);"
          },
          {
            "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.HasFullTextCatalog<TEntity>(this IndexBuilder<TEntity> indexBuilder, string catalogName);"
          },
          {
            "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.HasFullTextCatalog(this IConventionIndexBuilder indexBuilder, string? catalogName, bool fromDataAnnotation = false);"
          },
          {
            "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.HasFullTextChangeTracking(this IndexBuilder indexBuilder, FullTextChangeTracking changeTracking);"
          },
          {
            "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.HasFullTextChangeTracking<TEntity>(this IndexBuilder<TEntity> indexBuilder, FullTextChangeTracking changeTracking);"
          },
          {
            "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.HasFullTextKeyIndex(this IndexBuilder indexBuilder, string keyIndexName);"
          },
          {
            "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.HasFullTextKeyIndex<TEntity>(this IndexBuilder<TEntity> indexBuilder, string keyIndexName);"
          },
          {
            "Member": "static IConventionIndexBuilder? SqlServerIndexBuilderExtensions.HasFullTextKeyIndex(this IConventionIndexBuilder indexBuilder, string? keyIndexName, bool fromDataAnnotation = false);"
          },
          {
            "Member": "static IndexBuilder SqlServerIndexBuilderExtensions.HasFullTextLanguage(this IndexBuilder indexBuilder, string propertyName, string language);"
          },
          {
            "Member": "static IndexBuilder<TEntity> SqlServerIndexBuilderExtensions.HasFullTextLanguage<TEntity>(this IndexBuilder<TEntity> indexBuilder, string propertyName, string language);"
          }
        ]
      }
    },
    {
      "Type": "static class Microsoft.EntityFrameworkCore.SqlServerQueryableExtensions",
      "Methods": [
        {
          "Member": "static IQueryable<VectorSearchResult<T>> SqlServerQueryableExtensions.VectorSearch<T, TVector>(this DbSet<T> source, Expression<Func<T, TVector>> vectorPropertySelector, TVector similarTo, string metric, int topN);",
          "Stage": "Experimental"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "static IQueryable<FullTextSearchResult<TKey>> SqlServerQueryableExtensions.ContainsTable<T, TKey>(this DbSet<T> source, string searchCondition, Expression<Func<T, object>>? columnSelector = null, string? languageTerm = null, int? topN = null);"
          },
          {
            "Member": "static IQueryable<FullTextSearchResult<TKey>> SqlServerQueryableExtensions.FreeTextTable<T, TKey>(this DbSet<T> source, string freeText, Expression<Func<T, object>>? columnSelector = null, string? languageTerm = null, int? topN = null);"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "static IQueryable<FullTextSearchResult<TKey>> SqlServerQueryableExtensions.ContainsTable<T, TKey>(this DbSet<T> source, Expression<Func<T, object>> columnSelector, string searchCondition, string? languageTerm = null, int? topN = null);"
          },
          {
            "Member": "static IQueryable<FullTextSearchResult<TKey>> SqlServerQueryableExtensions.ContainsTable<T, TKey>(this DbSet<T> source, string searchCondition, string? languageTerm = null, int? topN = null);"
          },
          {
            "Member": "static IQueryable<FullTextSearchResult<TKey>> SqlServerQueryableExtensions.FreeTextTable<T, TKey>(this DbSet<T> source, Expression<Func<T, object>> columnSelector, string freeText, string? languageTerm = null, int? topN = null);"
          },
          {
            "Member": "static IQueryable<FullTextSearchResult<TKey>> SqlServerQueryableExtensions.FreeTextTable<T, TKey>(this DbSet<T> source, string freeText, string? languageTerm = null, int? topN = null);"
          }
        ]
      }
    },
    {
      "Type": "class Microsoft.EntityFrameworkCore.Metadata.Builders.SqlServerVectorIndexBuilder(Microsoft.EntityFrameworkCore.Metadata.Builders.IndexBuilder indexBuilder)",
      "Stage": "Experimental",
      "Methods": [
        {
          "Member": "SqlServerVectorIndexBuilder.SqlServerVectorIndexBuilder(IndexBuilder indexBuilder);",
          "Stage": "Experimental"
        },
        {
          "Member": "virtual SqlServerVectorIndexBuilder SqlServerVectorIndexBuilder.HasDatabaseName(string? name);",
          "Stage": "Experimental"
        }
      ],
      "Properties": [
        {
          "Member": "virtual IMutableIndex SqlServerVectorIndexBuilder.Metadata { get; }",
          "Stage": "Experimental"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "virtual SqlServerVectorIndexBuilder SqlServerVectorIndexBuilder.HasMetric(string metric);",
            "Stage": "Experimental"
          },
          {
            "Member": "virtual SqlServerVectorIndexBuilder SqlServerVectorIndexBuilder.HasType(string? type);",
            "Stage": "Experimental"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member": "virtual SqlServerVectorIndexBuilder SqlServerVectorIndexBuilder.UseMetric(string metric);",
            "Stage": "Experimental"
          },
          {
            "Member": "virtual SqlServerVectorIndexBuilder SqlServerVectorIndexBuilder.UseType(string? type);",
            "Stage": "Experimental"
          }
        ]
      }
    },
    {
      "Type": "class Microsoft.EntityFrameworkCore.Metadata.Builders.SqlServerVectorIndexBuilder<TEntity>(Microsoft.EntityFrameworkCore.Metadata.Builders.IndexBuilder<TEntity> indexBuilder)",
      "Stage": "Experimental",
      "Methods": [
        {
          "Member": "SqlServerVectorIndexBuilder<TEntity>.SqlServerVectorIndexBuilder(IndexBuilder<TEntity> indexBuilder);",
          "Stage": "Experimental"
        },
        {
          "Member": "virtual SqlServerVectorIndexBuilder<TEntity> SqlServerVectorIndexBuilder<TEntity>.HasDatabaseName(string? name);",
          "Stage": "Experimental"
        }
      ],
      "Properties": [
        {
          "Member": "virtual IMutableIndex SqlServerVectorIndexBuilder<TEntity>.Metadata { get; }",
          "Stage": "Experimental"
        }
      ],
      "Additions": {
        "Type": "",
        "Methods": [
          {
            "Member": "virtual SqlServerVectorIndexBuilder<TEntity> SqlServerVectorIndexBuilder<TEntity>.HasMetric(string metric);",
            "Stage": "Experimental"
          },
          {
            "Member": "virtual SqlServerVectorIndexBuilder<TEntity> SqlServerVectorIndexBuilder<TEntity>.HasType(string? type);",
            "Stage": "Experimental"
          }
        ]
      },
      "Removals": {
        "Type": "",
        "Methods": [
          {
            "Member
... (truncated)

src/EFCore/EFCore.baseline.json

Show delta
{
  "Name": "Microsoft.EntityFrameworkCore",
  "Types": [
    {
      "Type": "static class Microsoft.EntityFrameworkCore.Diagnostics.CoreStrings",
      "Methods": [
        {
          "Member": "static string CoreStrings.AbstractLeafEntityType(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.AddingProxyTypeAsEntityType(object? typeName);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousDependentEntity(object? entityType, object? targetEntryCall);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousEndRequiredDependent(object? foreignKeyProperties, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousEndRequiredDependentNavigation(object? entityType, object? navigation, object? foreignKeyProperties);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousEndRequiredInverted(object? foreignKeyProperties, object? entityType, object? principalEntityType);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousForeignKeyPropertyCandidates(object? firstDependentToPrincipalNavigationSpecification, object? firstPrincipalToDependentNavigationSpecification, object? secondDependentToPrincipalNavigationSpecification, object? secondPrincipalToDependentNavigationSpecification, object? foreignKeyProperties);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousOneToOneRelationship(object? dependentToPrincipalNavigationSpecification, object? principalToDependentNavigationSpecification);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousOwnedNavigation(object? entityTypeNavigationSpecification, object? otherEntityType);"
        },
        {
          "Member": "static string CoreStrings.AmbiguousSharedTypeEntityTypeName(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.AnnotationNotFound(object? annotation, object? annotatable);"
        },
        {
          "Member": "static string CoreStrings.ArgumentNotConstant(object? parameter, object? methodName);"
        },
        {
          "Member": "static string CoreStrings.ArgumentPropertyNull(object? property, object? argument);"
        },
        {
          "Member": "static string CoreStrings.AttributeNotOnEntityTypeProperty(object? attribute, object? type, object? propertyName);"
        },
        {
          "Member": "static string CoreStrings.AutoIncludeNavigationCycle(object? cycleNavigations);"
        },
        {
          "Member": "static string CoreStrings.AutoLoadedConcurrencyTokenProperty(object? property, object? type);"
        },
        {
          "Member": "static string CoreStrings.AutoLoadedConstructorProperty(object? property, object? type);"
        },
        {
          "Member": "static string CoreStrings.AutoLoadedDiscriminatorProperty(object? property, object? type);"
        },
        {
          "Member": "static string CoreStrings.AutoLoadedForeignKeyProperty(object? property, object? type);"
        },
        {
          "Member": "static string CoreStrings.AutoLoadedKeyProperty(object? property, object? type);"
        },
        {
          "Member": "static string CoreStrings.BackingFieldOnIndexer(object? field, object? entityType, object? property);"
        },
        {
          "Member": "static string CoreStrings.BadBackingFieldType(object? field, object? fieldType, object? entityType, object? property, object? propertyType);"
        },
        {
          "Member": "static string CoreStrings.BadDependencyRegistration(object? dependenciesType);"
        },
        {
          "Member": "static string CoreStrings.BadEnumValue(object? enumValue, object? enumType);"
        },
        {
          "Member": "static string CoreStrings.BadFilterDerivedType(object? filter, object? entityType, object? rootType);"
        },
        {
          "Member": "static string CoreStrings.BadFilterExpression(object? filter, object? entityType, object? clrType);"
        },
        {
          "Member": "static string CoreStrings.BadFilterOwnedType(object? filter, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.BadJsonValueReaderWriterType(object? givenType);"
        },
        {
          "Member": "static string CoreStrings.BadListType(object? givenType, object? listType);"
        },
        {
          "Member": "static string CoreStrings.BadValueComparerType(object? givenType, object? expectedType);"
        },
        {
          "Member": "static string CoreStrings.BadValueConverterType(object? givenType, object? expectedType);"
        },
        {
          "Member": "static string CoreStrings.BadValueGeneratorType(object? givenType, object? expectedType);"
        },
        {
          "Member": "static string CoreStrings.CannotBeNullable(object? property, object? entityType, object? propertyType);"
        },
        {
          "Member": "static string CoreStrings.CannotBeNullableElement(object? entityType, object? property, object? elementType);"
        },
        {
          "Member": "static string CoreStrings.CannotBeNullablePK(object? property, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.CannotConvertEnumValue(object? value, object? enumType);"
        },
        {
          "Member": "static string CoreStrings.CannotCreateJsonValueReaderWriter(object? readerWriterType);"
        },
        {
          "Member": "static string CoreStrings.CannotCreateValueComparer(object? generatorType, object? method);"
        },
        {
          "Member": "static string CoreStrings.CannotCreateValueConverter(object? generatorType, object? method);"
        },
        {
          "Member": "static string CoreStrings.CannotCreateValueGenerator(object? generatorType, object? method);"
        },
        {
          "Member": "static string CoreStrings.CannotLoadDetachedShadow(object? navigation, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.CannotMarkNonShared(object? type);"
        },
        {
          "Member": "static string CoreStrings.CannotMarkShared(object? type);"
        },
        {
          "Member": "static string CoreStrings.CannotMaterializeAbstractType(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.CanOnlyConfigureExistingNavigations(object? navigationName, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.ChangeTrackingInterfaceMissing(object? entityType, object? changeTrackingStrategy, object? notificationInterface);"
        },
        {
          "Member": "static string CoreStrings.CircularDependency(object? cycle);"
        },
        {
          "Member": "static string CoreStrings.CircularInheritance(object? entityType, object? baseEntityType);"
        },
        {
          "Member": "static string CoreStrings.ClashingMismatchedSharedType(object? entityType, object? otherClrType);"
        },
        {
          "Member": "static string CoreStrings.ClashingNamedOwnedType(object? ownedTypeName, object? ownerEntityType, object? navigation);"
        },
        {
          "Member": "static string CoreStrings.ClashingNonOwnedDerivedEntityType(object? entityType, object? derivedType);"
        },
        {
          "Member": "static string CoreStrings.ClashingNonOwnedEntityType(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.ClashingNonSharedType(object? entityType, object? type);"
        },
        {
          "Member": "static string CoreStrings.ClashingOwnedDerivedEntityType(object? entityType, object? derivedType);"
        },
        {
          "Member": "static string CoreStrings.ClashingOwnedEntityType(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.ClashingSharedType(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.ClientProjectionCapturingConstantInMethodArgument(object? constantType, object? methodName);"
        },
        {
          "Member": "static string CoreStrings.ClientProjectionCapturingConstantInMethodInstance(object? constantType, object? methodName);"
        },
        {
          "Member": "static string CoreStrings.ClientProjectionCapturingConstantInTree(object? constantType);"
        },
        {
          "Member": "static string CoreStrings.CollectionIsReference(object? property, object? entityType, object? collectionMethod, object? referenceMethod);"
        },
        {
          "Member": "static string CoreStrings.ComparerPropertyMismatch(object? type, object? entityType, object? propertyName, object? propertyType);"
        },
        {
          "Member": "static string CoreStrings.ComparerPropertyMismatchElement(object? type, object? entityType, object? propertyName, object? elementType);"
        },
        {
          "Member": "static string CoreStrings.CompiledModelDuplicateAttribute(object? assemblyName, object? contextType);"
        },
        {
          "Member": "static string CoreStrings.CompiledModelIncompatibleTypeMapping(object? typeMapping);"
        },
        {
          "Member": "static string CoreStrings.CompiledModelMissingInstance(object? modelType);"
        },
        {
          "Member": "static string CoreStrings.CompiledQueryDifferentModel(object? queryExpression);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionEntryDeletedEntity(object? ordinal, object? declaringType, object? collection);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionEntryInvalidStateChange(object? property);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionEntryOrdinalInvalid(object? ordinal, object? declaringType, object? collection, object? count);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionEntryOrdinalReadOnly(object? collectionDeclaringType, object? collection);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionEntryOriginalNull(object? declaringType, object? collection);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionEntryOriginalOrdinalInvalid(object? ordinal, object? declaringType, object? collection, object? count);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionEntryOriginalOrdinalReadOnly(object? collectionDeclaringType, object? collection);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionIsReference(object? entityType, object? property, object? collectionMethod, object? referenceMethod);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionMoveInvalidOrdinals(object? fromOrdinal, object? toOrdinal, object? count);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionNotInitialized(object? entityType, object? collection);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionNullElementSetter(object? complexType, object? property, object? collectionDeclaringType, object? collection, object? ordinal);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionOrdinalOutOfRange(object? ordinal, object? entityType, object? collection, object? count);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionOriginalEntryAddedEntity(object? ordinal, object? declaringType, object? collection);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionValueNotDictionaryList(object? property, object? typeName);"
        },
        {
          "Member": "static string CoreStrings.ComplexCollectionWrongClrType(object? property, object? type, object? clrType, object? targetType);"
        },
        {
          "Member": "static string CoreStrings.ComplexPropertyIndexer(object? type, object? property);"
        },
        {
          "Member": "static string CoreStrings.ComplexPropertyNotCollection(object? type, object? property);"
        },
        {
          "Member": "static string CoreStrings.ComplexPropertyNotFound(object? type, object? property);"
        },
        {
          "Member": "static string CoreStrings.ComplexPropertyShadow(object? type, object? property);"
        },
        {
          "Member": "static string CoreStrings.ComplexPropertyValueNotDictionary(object? property, object? typeName);"
        },
        {
          "Member": "static string CoreStrings.ComplexPropertyValueNotList(object? property, object? clrType, object? typeName);"
        },
        {
          "Member": "static string CoreStrings.ComplexPropertyWrongClrType(object? property, object? type, object? clrType, object? targetType);"
        },
        {
          "Member": "static string CoreStrings.ComplexReferenceIsCollection(object? entityType, object? property, object? referenceMethod, object? collectionMethod);"
        },
        {
          "Member": "static string CoreStrings.ComplexTypeNotificationChangeTracking(object? complexType, object? changeTrackingStrategy);"
        },
        {
          "Member": "static string CoreStrings.ComplexTypeShadowProperty(object? complexType, object? property);"
        },
        {
          "Member": "static string CoreStrings.ComplexTypesNotSupported(object? service);"
        },
        {
          "Member": "static string CoreStrings.ComplexValueTypeCollection(object? type, object? property);"
        },
        {
          "Member": "static string CoreStrings.ComplexValueTypeShadowProperty(object? type, object? property);"
        },
        {
          "Member": "static string CoreStrings.CompositeFkOnProperty(object? navigation, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.CompositePKWithDataAnnotation(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.ConflictingBackingFields(object? property, object? entityType, object? field1, object? field2);"
        },
        {
          "Member": "static string CoreStrings.ConflictingFieldProperty(object? type, object? property, object? field, object? conflictingType, object? conflictingProperty);"
        },
        {
          "Member": "static string CoreStrings.ConflictingForeignKeyAttributes(object? propertyList, object? entityType, object? principalEntityType);"
        },
        {
          "Member": "static string CoreStrings.ConflictingKeylessAndPrimaryKeyAttributes(object? entity);"
        },
        {
          "Member": "static string CoreStrings.ConflictingPropertyOrNavigation(object? member, object? type, object? conflictingType);"
        },
        {
          "Member": "static string CoreStrings.ConflictingRelationshipConversions(object? entityType, object? property, object? valueConversion, object? conflictingValueConversion);"
        },
        {
          "Member": "static string CoreStrings.ConflictingRelationshipNavigation(object? newPrincipalNavigationSpecification, object? newDependentNavigationSpecification, object? existingPrincipalNavigationSpecification, object? existingDependentNavigationSpecification);"
        },
        {
          "Member": "static string CoreStrings.ConstructorBindingFailed(object? failedBinds, object? parameters);"
        },
        {
          "Member": "static string CoreStrings.ConstructorConflict(object? firstConstructor, object? secondConstructor);"
        },
        {
          "Member": "static string CoreStrings.ConstructorNotFound(object? type, object? constructors);"
        },
        {
          "Member": "static string CoreStrings.ConverterBadType(object? converter, object? type, object? allowed);"
        },
        {
          "Member": "static string CoreStrings.ConverterPropertyMismatch(object? converterType, object? entityType, object? propertyName, object? propertyType);"
        },
        {
          "Member": "static string CoreStrings.ConverterPropertyMismatchElement(object? converterType, object? entityType, object? propertyName, object? elementType);"
        },
        {
          "Member": "static string CoreStrings.ConvertersCannotBeComposed(object? typeOneIn, object? typeOneOut, object? typeTwoIn, object? typeTwoOut);"
        },
        {
          "Member": "static string CoreStrings.DbContextMissingConstructor(object? contextType);"
        },
        {
          "Member": "static string CoreStrings.DbSetIncorrectGenericType(object? entityType, object? entityClrType, object? genericType);"
        },
        {
          "Member": "static string CoreStrings.DebugViewError(object? message);"
        },
        {
          "Member": "static string CoreStrings.DebugViewQueryExpressionError(object? message);"
        },
        {
          "Member": "static string CoreStrings.DebugViewQueryStringError(object? message);"
        },
        {
          "Member": "static string CoreStrings.DeleteBehaviorAttributeNotOnNavigationProperty(object? type, object? propertyName);"
        },
        {
          "Member": "static string CoreStrings.DeleteBehaviorAttributeOnPrincipalProperty(object? entityType, object? navigationName);"
        },
        {
          "Member": "static string CoreStrings.DependentEntityTypeNotInRelationship(object? dependentEntityType, object? principalEntityType, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.DerivedEntityCannotBeKeyless(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.DerivedEntityCannotHaveKeys(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.DerivedEntityOwnershipMismatch(object? baseEntityType, object? derivedEntityType, object? ownedEntityType, object? nonOwnedEntityType);"
        },
        {
          "Member": "static string CoreStrings.DerivedEntityTypeHasNoKey(object? derivedType, object? rootType);"
        },
        {
          "Member": "static string CoreStrings.DerivedEntityTypeKey(object? derivedType, object? rootType);"
        },
        {
          "Member": "static string CoreStrings.DerivedTypeDefiningQuery(object? entityType, object? baseType);"
        },
        {
          "Member": "static string CoreStrings.DiscriminatorEntityTypeNotDerived(object? entityType, object? rootEntityType);"
        },
        {
          "Member": "static string CoreStrings.DiscriminatorPropertyMustBeOnRoot(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.DiscriminatorPropertyNotAllowedOnComplexCollection(object? type, object? containingType);"
        },
        {
          "Member": "static string CoreStrings.DiscriminatorPropertyNotFound(object? property, object? entityType);"
        },
        {
          "Member": "static string CoreStrings.DiscriminatorValueIncompatible(object? value, object? entityType, object? discriminatorType);"
        },
        {
          "Member": "static string CoreStrings.DuplicateAnnotation(object? annotation, object? annotatable);"
        },
        {
          "Member": "static string CoreStrings.DuplicateComplexType(object? complexType);"
        },
        {
          "Member": "static string CoreStrings.DuplicateDiscriminatorValue(object? entityType1, object? discriminatorValue, object? entityType2);"
        },
        {
          "Member": "static string CoreStrings.DuplicateEntityType(object? entityType);"
        },
        {
          "Member": "static string CoreStrings.DuplicateForeignKey(object? foreignKeyProperties, object? entityType, object? duplicateEntityType, object? keyProperties, object? principalType);"
        },
        {
          "Member": "static string CoreStrings.D
... (truncated)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api-review This PR or issue is introducing public API changes that need to be reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Fully integrate JSON mapping into the relational model Change partial update JSON path to be be structured instead of a string JSONPATH

3 participants