Skip to content

Comments

Fix HasDiscriminator with default name "Discriminator" failing for non-string types#37785

Draft
Copilot wants to merge 2 commits intomainfrom
copilot/fix-discriminator-issue-ef-core-10
Draft

Fix HasDiscriminator with default name "Discriminator" failing for non-string types#37785
Copilot wants to merge 2 commits intomainfrom
copilot/fix-discriminator-issue-ef-core-10

Conversation

Copy link
Contributor

Copilot AI commented Feb 24, 2026

When calling .HasDiscriminator<TEnum>("Discriminator") using the default discriminator column name, EF Core 10 incorrectly throws during model validation because conventions override the user-configured type back to string.

// Throws: discriminator value 'Issue' not assignable to property of type 'string'
builder.HasDiscriminator<AttributeDataType>("Discriminator")
    .HasValue<ItemAttribute>(AttributeDataType.Item)
    .HasValue<IssueAttribute>(AttributeDataType.Issue);

// Workaround (any non-default name works fine)
builder.HasDiscriminator<AttributeDataType>("DiscriminatorX")...

Root cause

TypeBase.SetDiscriminatorProperty has an early return when the property name is unchanged (e.g., user specifies "Discriminator" and the convention-created default is also "Discriminator"). This early return skipped updating the annotation's ConfigurationSource, leaving it at Convention. When derived types were subsequently registered, conventions re-ran and, seeing a Convention-level annotation, successfully overrode the discriminator property type back to string.

Fix

  • TypeBase.SetDiscriminatorProperty: when taking the early return for an unchanged property name, also call UpdateConfigurationSource on the existing annotation so the caller's ConfigurationSource (e.g., Explicit) is properly propagated.
  • Added regression test Does_not_detect_missing_discriminator_values_when_using_default_discriminator_name_with_non_string_type to ModelValidatorTest.
Original prompt

This section details on the original issue you should resolve

<issue_title>EF Core 10: .HasDiscriminator("Discriminator") fails when using default discriminator name (works if renamed)</issue_title>
<issue_description>### Bug description

After upgrading to EF Core 10, configuring TPH inheritance with .HasDiscriminator() fails only when using the default discriminator column name "Discriminator".

Renaming the discriminator column (for example to "DiscriminatorX") makes the issue disappear.

This appears to be a breaking change or regression in EF Core 10 model validation.

Your code

public class AttributeConfiguration : EntityTypeConfiguration<Attribute>
{
    public override void Configure(EntityTypeBuilder<Attribute> builder)
    {
        builder
            .HasDiscriminator<AttributeDataType>("Discriminator")
            .HasValue<ItemAttribute>(AttributeDataType.Item)
            .HasValue<FolderAttribute>(AttributeDataType.Folder)
            .HasValue<IssueAttribute>(AttributeDataType.Issue);
    }
}

Stack traces

System.InvalidOperationException:
The discriminator value 'Issue' for the entity type 'IssueAttribute' cannot be set because it is not assignable to the discriminator property of type 'string'.

at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateDiscriminatorValues(IEntityType rootEntityType)
at Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.ValidateInheritanceMapping(IModel model, IDiagnosticsLogger`1 logger)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
at Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
at Npgsql.EntityFrameworkCore.PostgreSQL.Infrastructure.Internal.NpgsqlModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelRuntimeInitializer.Initialize(IModel model, Boolean designTime, IDiagnosticsLogger`1 validationLogger)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, ModelCreationDependencies modelCreationDependencies, Boolean designTime)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, ModelCreationDependencies modelCreationDependencies, Boolean designTime)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel(Boolean designTime)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()

Verbose output


EF Core version

10.0.2

Database provider

Npgsql.EntityFrameworkCore.PostgreSQL

Target framework

.NET 10

Operating system

ubuntu 24.04

IDE

No response</issue_description>

Comments on the Issue (you are @copilot in this section)


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

…hanged

Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix issue with .HasDiscriminator in EF Core 10 Fix HasDiscriminator with default name "Discriminator" failing for non-string types Feb 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

EF Core 10: .HasDiscriminator("Discriminator") fails when using default discriminator name (works if renamed)

2 participants