diff --git a/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs b/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs index 04a6940a970..d3bfe6092e3 100644 --- a/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs +++ b/src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs @@ -644,8 +644,7 @@ protected virtual void GenerateComplexPropertyAnnotations( .Append('.') .Append("HasDiscriminator"); - if (discriminatorProperty.DeclaringType == property.ComplexType - && discriminatorProperty.Name != "Discriminator") + if (discriminatorProperty.DeclaringType == property.ComplexType) { var propertyClrType = FindValueConverter(discriminatorProperty)?.ProviderClrType .MakeNullable(discriminatorProperty.IsNullable) @@ -953,8 +952,7 @@ protected virtual void GenerateEntityTypeAnnotations( .Append('.') .Append("HasDiscriminator"); - if (discriminatorProperty.DeclaringType == entityType - && discriminatorProperty.Name != "Discriminator") + if (discriminatorProperty.DeclaringType == entityType) { var propertyClrType = FindValueConverter(discriminatorProperty)?.ProviderClrType .MakeNullable(discriminatorProperty.IsNullable) diff --git a/test/EFCore.Design.Tests/Migrations/Design/CSharpMigrationsGeneratorTest.ModelSnapshot.cs b/test/EFCore.Design.Tests/Migrations/Design/CSharpMigrationsGeneratorTest.ModelSnapshot.cs index dade6edb6ff..6324f7845aa 100644 --- a/test/EFCore.Design.Tests/Migrations/Design/CSharpMigrationsGeneratorTest.ModelSnapshot.cs +++ b/test/EFCore.Design.Tests/Migrations/Design/CSharpMigrationsGeneratorTest.ModelSnapshot.cs @@ -14,6 +14,7 @@ using NetTopologySuite; using NetTopologySuite.Geometries; using Xunit.Sdk; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; // ReSharper disable InconsistentNaming // ReSharper disable UnusedAutoPropertyAccessor.Local @@ -2022,7 +2023,7 @@ public virtual void CheckConstraint_is_only_stored_in_snapshot_once_for_TPH() b.ToTable("BaseEntity", "DefaultSchema"); - b.HasDiscriminator().HasValue("BaseEntity"); + b.HasDiscriminator("Discriminator").HasValue("BaseEntity"); b.UseTphMappingStrategy(); }); @@ -2354,7 +2355,7 @@ public virtual void BaseType_is_stored_in_snapshot() b.ToTable("BaseEntity", "DefaultSchema"); - b.HasDiscriminator().HasValue("BaseEntity"); + b.HasDiscriminator("Discriminator").HasValue("BaseEntity"); b.UseTphMappingStrategy(); }); @@ -2425,7 +2426,7 @@ public virtual void Discriminator_annotations_are_stored_in_snapshot() b.ToTable("BaseEntity", "DefaultSchema"); - b.HasDiscriminator().IsComplete(true).HasValue("BaseEntity"); + b.HasDiscriminator("Discriminator").IsComplete(true).HasValue("BaseEntity"); b.UseTphMappingStrategy(); }); @@ -2500,7 +2501,7 @@ public virtual void Converted_discriminator_annotations_are_stored_in_snapshot() b.ToTable("BaseEntityWithStructDiscriminator", "DefaultSchema"); - b.HasDiscriminator().IsComplete(true).HasValue("Base"); + b.HasDiscriminator("Discriminator").IsComplete(true).HasValue("Base"); b.UseTphMappingStrategy(); }); @@ -2527,13 +2528,18 @@ public virtual void Converted_discriminator_annotations_are_stored_in_snapshot() """), o => { + var baseEntityType = o.FindEntityType(typeof(BaseEntityWithStructDiscriminator)); Assert.Equal( "Discriminator", - o.FindEntityType(typeof(BaseEntityWithStructDiscriminator))[CoreAnnotationNames.DiscriminatorProperty]); + baseEntityType[CoreAnnotationNames.DiscriminatorProperty]); Assert.Equal( "Base", - o.FindEntityType(typeof(BaseEntityWithStructDiscriminator))[CoreAnnotationNames.DiscriminatorValue]); + baseEntityType[CoreAnnotationNames.DiscriminatorValue]); + + var discriminatorProperty = baseEntityType.FindDiscriminatorProperty(); + Assert.Equal(typeof(string), discriminatorProperty.ClrType); + Assert.Equal("Discriminator", discriminatorProperty.Name); Assert.Equal( "Another", @@ -3375,6 +3381,55 @@ public virtual void Discriminator_of_enum_to_string() Assert.False(discriminatorProperty.IsNullable); }); + [ConditionalFact] + public virtual void Discriminator_with_non_string_default_name_is_stored_in_snapshot() + => Test( + builder => + { + builder.Entity().HasBaseType(); + builder.Entity() + .Ignore(b => b.Navigation) + .HasDiscriminator("Discriminator") + .HasValue(0) + .HasValue(1); + }, + AddBoilerPlate( + GetHeading() + + """ + modelBuilder.Entity("Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGeneratorTest+BaseType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Discriminator") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("BaseType", "DefaultSchema"); + + b.HasDiscriminator("Discriminator").HasValue(0); + + b.UseTphMappingStrategy(); + }); + + modelBuilder.Entity("Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGeneratorTest+DerivedType", b => + { + b.HasBaseType("Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGeneratorTest+BaseType"); + + b.HasDiscriminator().HasValue(1); + }); +"""), + model => + { + var discriminatorProperty = model.FindEntityType(typeof(BaseType))!.FindDiscriminatorProperty(); + Assert.Equal(typeof(int), discriminatorProperty.ClrType); + Assert.Equal("Discriminator", discriminatorProperty.Name); + }); + [ConditionalFact] public virtual void Temporal_table_information_is_stored_in_snapshot() => Test( @@ -4939,7 +4994,7 @@ public virtual void Property_column_name_is_stored_in_snapshot_when_DefaultColum b.ToTable("BarBase", "DefaultSchema"); - b.HasDiscriminator().HasValue("BarBase"); + b.HasDiscriminator("Discriminator").HasValue("BarBase"); b.UseTphMappingStrategy(); }); @@ -5155,7 +5210,7 @@ public virtual void Property_column_name_on_specific_table_is_stored_in_snapshot b.ToTable("BaseEntity", "DefaultSchema"); - b.HasDiscriminator().HasValue("BaseEntity"); + b.HasDiscriminator("Discriminator").HasValue("BaseEntity"); b.UseTphMappingStrategy(); }); @@ -7718,7 +7773,7 @@ public virtual void Do_not_generate_entity_type_builder_again_if_no_foreign_key_ b.ToTable("BaseType", "DefaultSchema"); - b.HasDiscriminator().HasValue("BaseType"); + b.HasDiscriminator("Discriminator").HasValue("BaseType"); b.UseTphMappingStrategy(); });