Skip to content

Commit 529b311

Browse files
CopilotAndriySvyryd
andcommitted
Fix #37143: Always generate HasDiscriminator with generic type argument and property name
Co-authored-by: AndriySvyryd <[email protected]>
1 parent 2ef2e24 commit 529b311

File tree

2 files changed

+70
-11
lines changed

2 files changed

+70
-11
lines changed

src/EFCore.Design/Migrations/Design/CSharpSnapshotGenerator.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,7 @@ protected virtual void GenerateComplexPropertyAnnotations(
644644
.Append('.')
645645
.Append("HasDiscriminator");
646646

647-
if (discriminatorProperty.DeclaringType == property.ComplexType
648-
&& discriminatorProperty.Name != "Discriminator")
647+
if (discriminatorProperty.DeclaringType == property.ComplexType)
649648
{
650649
var propertyClrType = FindValueConverter(discriminatorProperty)?.ProviderClrType
651650
.MakeNullable(discriminatorProperty.IsNullable)
@@ -953,8 +952,7 @@ protected virtual void GenerateEntityTypeAnnotations(
953952
.Append('.')
954953
.Append("HasDiscriminator");
955954

956-
if (discriminatorProperty.DeclaringType == entityType
957-
&& discriminatorProperty.Name != "Discriminator")
955+
if (discriminatorProperty.DeclaringType == entityType)
958956
{
959957
var propertyClrType = FindValueConverter(discriminatorProperty)?.ProviderClrType
960958
.MakeNullable(discriminatorProperty.IsNullable)

test/EFCore.Design.Tests/Migrations/Design/CSharpMigrationsGeneratorTest.ModelSnapshot.cs

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,16 @@ private class EntityWithNullableEnumType
547547
public Days? Day { get; set; }
548548
}
549549

550+
private class BaseEntityWithIntDiscriminator
551+
{
552+
public int Id { get; set; }
553+
}
554+
555+
private class DerivedEntityWithIntDiscriminator : BaseEntityWithIntDiscriminator
556+
{
557+
public string Name { get; set; }
558+
}
559+
550560
private class ManyToManyLeft
551561
{
552562
public int Id { get; set; }
@@ -2022,7 +2032,7 @@ public virtual void CheckConstraint_is_only_stored_in_snapshot_once_for_TPH()
20222032
20232033
b.ToTable("BaseEntity", "DefaultSchema");
20242034
2025-
b.HasDiscriminator().HasValue("BaseEntity");
2035+
b.HasDiscriminator<string>("Discriminator").HasValue("BaseEntity");
20262036
20272037
b.UseTphMappingStrategy();
20282038
});
@@ -2354,7 +2364,7 @@ public virtual void BaseType_is_stored_in_snapshot()
23542364
23552365
b.ToTable("BaseEntity", "DefaultSchema");
23562366
2357-
b.HasDiscriminator().HasValue("BaseEntity");
2367+
b.HasDiscriminator<string>("Discriminator").HasValue("BaseEntity");
23582368
23592369
b.UseTphMappingStrategy();
23602370
});
@@ -2425,7 +2435,7 @@ public virtual void Discriminator_annotations_are_stored_in_snapshot()
24252435
24262436
b.ToTable("BaseEntity", "DefaultSchema");
24272437
2428-
b.HasDiscriminator().IsComplete(true).HasValue("BaseEntity");
2438+
b.HasDiscriminator<string>("Discriminator").IsComplete(true).HasValue("BaseEntity");
24292439
24302440
b.UseTphMappingStrategy();
24312441
});
@@ -2500,7 +2510,7 @@ public virtual void Converted_discriminator_annotations_are_stored_in_snapshot()
25002510
25012511
b.ToTable("BaseEntityWithStructDiscriminator", "DefaultSchema");
25022512
2503-
b.HasDiscriminator().IsComplete(true).HasValue("Base");
2513+
b.HasDiscriminator<string>("Discriminator").IsComplete(true).HasValue("Base");
25042514
25052515
b.UseTphMappingStrategy();
25062516
});
@@ -3375,6 +3385,57 @@ public virtual void Discriminator_of_enum_to_string()
33753385
Assert.False(discriminatorProperty.IsNullable);
33763386
});
33773387

3388+
[ConditionalFact]
3389+
public virtual void Discriminator_with_non_string_default_name_is_stored_in_snapshot()
3390+
=> Test(
3391+
builder =>
3392+
{
3393+
builder.Entity<DerivedEntityWithIntDiscriminator>().HasBaseType<BaseEntityWithIntDiscriminator>();
3394+
builder.Entity<BaseEntityWithIntDiscriminator>()
3395+
.HasDiscriminator<int>("Discriminator")
3396+
.HasValue<BaseEntityWithIntDiscriminator>(0)
3397+
.HasValue<DerivedEntityWithIntDiscriminator>(1);
3398+
},
3399+
AddBoilerPlate(
3400+
GetHeading()
3401+
+ """
3402+
modelBuilder.Entity("Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGeneratorTest+BaseEntityWithIntDiscriminator", b =>
3403+
{
3404+
b.Property<int>("Id")
3405+
.ValueGeneratedOnAdd()
3406+
.HasColumnType("int");
3407+
3408+
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
3409+
3410+
b.Property<int>("Discriminator")
3411+
.HasColumnType("int");
3412+
3413+
b.HasKey("Id");
3414+
3415+
b.ToTable("BaseEntityWithIntDiscriminator", "DefaultSchema");
3416+
3417+
b.HasDiscriminator<int>("Discriminator").HasValue(0);
3418+
3419+
b.UseTphMappingStrategy();
3420+
});
3421+
3422+
modelBuilder.Entity("Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGeneratorTest+DerivedEntityWithIntDiscriminator", b =>
3423+
{
3424+
b.HasBaseType("Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGeneratorTest+BaseEntityWithIntDiscriminator");
3425+
3426+
b.Property<string>("Name")
3427+
.HasColumnType("nvarchar(max)");
3428+
3429+
b.HasDiscriminator().HasValue(1);
3430+
});
3431+
"""),
3432+
model =>
3433+
{
3434+
var discriminatorProperty = model.GetEntityTypes().First().FindDiscriminatorProperty();
3435+
Assert.Equal(typeof(int), discriminatorProperty.ClrType);
3436+
Assert.Equal("Discriminator", discriminatorProperty.Name);
3437+
});
3438+
33783439
[ConditionalFact]
33793440
public virtual void Temporal_table_information_is_stored_in_snapshot()
33803441
=> Test(
@@ -4939,7 +5000,7 @@ public virtual void Property_column_name_is_stored_in_snapshot_when_DefaultColum
49395000
49405001
b.ToTable("BarBase", "DefaultSchema");
49415002
4942-
b.HasDiscriminator().HasValue("BarBase");
5003+
b.HasDiscriminator<string>("Discriminator").HasValue("BarBase");
49435004
49445005
b.UseTphMappingStrategy();
49455006
});
@@ -5155,7 +5216,7 @@ public virtual void Property_column_name_on_specific_table_is_stored_in_snapshot
51555216
51565217
b.ToTable("BaseEntity", "DefaultSchema");
51575218
5158-
b.HasDiscriminator().HasValue("BaseEntity");
5219+
b.HasDiscriminator<string>("Discriminator").HasValue("BaseEntity");
51595220
51605221
b.UseTphMappingStrategy();
51615222
});
@@ -7718,7 +7779,7 @@ public virtual void Do_not_generate_entity_type_builder_again_if_no_foreign_key_
77187779
77197780
b.ToTable("BaseType", "DefaultSchema");
77207781
7721-
b.HasDiscriminator().HasValue("BaseType");
7782+
b.HasDiscriminator<string>("Discriminator").HasValue("BaseType");
77227783
77237784
b.UseTphMappingStrategy();
77247785
});

0 commit comments

Comments
 (0)