Skip to content

Commit f08ecf3

Browse files
committed
Don't generate a discriminator in the snapshot if there's no discriminator property.
Fixes #33605
1 parent 4900726 commit f08ecf3

File tree

3 files changed

+157
-62
lines changed

3 files changed

+157
-62
lines changed

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

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -886,65 +886,68 @@ protected virtual void GenerateEntityTypeAnnotations(
886886
?? discriminatorValueAnnotation?.Value)
887887
!= null)
888888
{
889-
stringBuilder
890-
.AppendLine()
891-
.Append(entityTypeBuilderName)
892-
.Append('.')
893-
.Append("HasDiscriminator");
894-
895889
var discriminatorProperty = entityType.FindDiscriminatorProperty();
896-
if (discriminatorPropertyAnnotation?.Value != null
897-
&& discriminatorProperty != null)
898-
{
899-
var propertyClrType = FindValueConverter(discriminatorProperty)?.ProviderClrType
900-
.MakeNullable(discriminatorProperty.IsNullable)
901-
?? discriminatorProperty.ClrType;
902-
stringBuilder
903-
.Append('<')
904-
.Append(Code.Reference(propertyClrType))
905-
.Append(">(")
906-
.Append(Code.Literal(discriminatorProperty.Name))
907-
.Append(')');
908-
}
909-
else
890+
if (discriminatorProperty != null)
910891
{
911892
stringBuilder
912-
.Append("()");
913-
}
893+
.AppendLine()
894+
.Append(entityTypeBuilderName)
895+
.Append('.')
896+
.Append("HasDiscriminator");
914897

915-
if (discriminatorMappingCompleteAnnotation?.Value != null)
916-
{
917-
var value = (bool)discriminatorMappingCompleteAnnotation.Value;
898+
if (discriminatorProperty.DeclaringType == entityType
899+
&& discriminatorProperty.Name != "Discriminator")
900+
{
901+
var propertyClrType = FindValueConverter(discriminatorProperty)?.ProviderClrType
902+
.MakeNullable(discriminatorProperty.IsNullable)
903+
?? discriminatorProperty.ClrType;
904+
stringBuilder
905+
.Append('<')
906+
.Append(Code.Reference(propertyClrType))
907+
.Append(">(")
908+
.Append(Code.Literal(discriminatorProperty.Name))
909+
.Append(')');
910+
}
911+
else
912+
{
913+
stringBuilder
914+
.Append("()");
915+
}
918916

919-
stringBuilder
920-
.Append('.')
921-
.Append("IsComplete")
922-
.Append('(')
923-
.Append(Code.Literal(value))
924-
.Append(')');
925-
}
917+
if (discriminatorMappingCompleteAnnotation?.Value != null)
918+
{
919+
var value = (bool)discriminatorMappingCompleteAnnotation.Value;
926920

927-
if (discriminatorValueAnnotation?.Value != null)
928-
{
929-
var value = discriminatorValueAnnotation.Value;
930-
if (discriminatorProperty != null)
921+
stringBuilder
922+
.Append('.')
923+
.Append("IsComplete")
924+
.Append('(')
925+
.Append(Code.Literal(value))
926+
.Append(')');
927+
}
928+
929+
if (discriminatorValueAnnotation?.Value != null)
931930
{
932-
var valueConverter = FindValueConverter(discriminatorProperty);
933-
if (valueConverter != null)
931+
var value = discriminatorValueAnnotation.Value;
932+
if (discriminatorProperty != null)
934933
{
935-
value = valueConverter.ConvertToProvider(value);
934+
var valueConverter = FindValueConverter(discriminatorProperty);
935+
if (valueConverter != null)
936+
{
937+
value = valueConverter.ConvertToProvider(value);
938+
}
936939
}
940+
941+
stringBuilder
942+
.Append('.')
943+
.Append("HasValue")
944+
.Append('(')
945+
.Append(Code.UnknownLiteral(value))
946+
.Append(')');
937947
}
938948

939-
stringBuilder
940-
.Append('.')
941-
.Append("HasValue")
942-
.Append('(')
943-
.Append(Code.UnknownLiteral(value))
944-
.Append(')');
949+
stringBuilder.AppendLine(";");
945950
}
946-
947-
stringBuilder.AppendLine(";");
948951
}
949952

950953
GenerateAnnotations(entityTypeBuilderName, entityType, stringBuilder, annotations, inChainedCall: false);

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,7 @@ public void Test_new_annotations_handled_for_entity_types()
134134
},
135135
{
136136
CoreAnnotationNames.DiscriminatorValue, ("MyDiscriminatorValue",
137-
_toTable
138-
+ ";"
139-
+ _nl
140-
+ _nl
141-
+ "entityTypeBuilder.HasDiscriminator"
142-
+ "()."
143-
+ nameof(DiscriminatorBuilder.HasValue)
144-
+ @"(""MyDiscriminatorValue"")")
137+
_toTable)
145138
},
146139
{
147140
RelationalAnnotationNames.Comment, ("My Comment",

test/EFCore.Design.Tests/Migrations/ModelSnapshotSqlServerTest.cs

Lines changed: 106 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,105 @@ protected override void BuildModel(ModelBuilder modelBuilder)
999999
Assert.Null(humanPetType.GetViewName());
10001000
});
10011001

1002+
[ConditionalFact] // Issue #33605
1003+
public virtual void Abstract_base_class_with_TPT()
1004+
=> Test(
1005+
builder =>
1006+
{
1007+
builder.Entity<Cat>().ToTable("Cats");
1008+
builder.Entity<Dog>().ToTable("Dogs");
1009+
builder.Entity<Animal>();
1010+
builder.Ignore<Human>();
1011+
builder.Ignore<Pet>();
1012+
builder.Ignore<Animal>();
1013+
},
1014+
"""
1015+
// <auto-generated />
1016+
using Microsoft.EntityFrameworkCore;
1017+
using Microsoft.EntityFrameworkCore.Infrastructure;
1018+
using Microsoft.EntityFrameworkCore.Metadata;
1019+
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
1020+
1021+
#nullable disable
1022+
1023+
namespace RootNamespace
1024+
{
1025+
[DbContext(typeof(DbContext))]
1026+
partial class Snapshot : ModelSnapshot
1027+
{
1028+
protected override void BuildModel(ModelBuilder modelBuilder)
1029+
{
1030+
#pragma warning disable 612, 618
1031+
modelBuilder
1032+
.HasDefaultSchema("DefaultSchema")
1033+
.HasAnnotation("Relational:MaxIdentifierLength", 128);
1034+
1035+
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
1036+
1037+
modelBuilder.Entity("Microsoft.EntityFrameworkCore.Migrations.ModelSnapshotSqlServerTest+Cat", b =>
1038+
{
1039+
b.Property<int>("Id")
1040+
.ValueGeneratedOnAdd()
1041+
.HasColumnType("int");
1042+
1043+
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
1044+
1045+
b.Property<string>("EducationLevel")
1046+
.HasColumnType("nvarchar(max)");
1047+
1048+
b.Property<string>("Name")
1049+
.HasColumnType("nvarchar(max)");
1050+
1051+
b.Property<string>("Vet")
1052+
.HasColumnType("nvarchar(max)");
1053+
1054+
b.HasKey("Id");
1055+
1056+
b.ToTable("Cats", "DefaultSchema");
1057+
});
1058+
1059+
modelBuilder.Entity("Microsoft.EntityFrameworkCore.Migrations.ModelSnapshotSqlServerTest+Dog", b =>
1060+
{
1061+
b.Property<int>("Id")
1062+
.ValueGeneratedOnAdd()
1063+
.HasColumnType("int");
1064+
1065+
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
1066+
1067+
b.Property<string>("FavoriteToy")
1068+
.HasColumnType("nvarchar(max)");
1069+
1070+
b.Property<string>("Name")
1071+
.HasColumnType("nvarchar(max)");
1072+
1073+
b.Property<string>("Vet")
1074+
.HasColumnType("nvarchar(max)");
1075+
1076+
b.HasKey("Id");
1077+
1078+
b.ToTable("Dogs", "DefaultSchema");
1079+
});
1080+
#pragma warning restore 612, 618
1081+
}
1082+
}
1083+
}
1084+
1085+
""",
1086+
model =>
1087+
{
1088+
Assert.Equal(5, model.GetAnnotations().Count());
1089+
Assert.Equal(2, model.GetEntityTypes().Count());
1090+
1091+
var catType = model.FindEntityType("Microsoft.EntityFrameworkCore.Migrations.ModelSnapshotSqlServerTest+Cat");
1092+
Assert.Equal("Cats", catType.GetTableName());
1093+
Assert.Null(catType.GetViewName());
1094+
Assert.Null(catType.FindProperty("Discriminator"));
1095+
1096+
var dogType = model.FindEntityType("Microsoft.EntityFrameworkCore.Migrations.ModelSnapshotSqlServerTest+Dog");
1097+
Assert.Equal("Dogs", dogType.GetTableName());
1098+
Assert.Null(dogType.GetViewName());
1099+
});
1100+
10021101
[ConditionalFact]
10031102
public virtual void Entity_splitting_is_stored_in_snapshot_with_tables()
10041103
=> Test(
@@ -1678,7 +1777,7 @@ public virtual void CheckConstraint_is_only_stored_in_snapshot_once_for_TPH()
16781777
16791778
b.ToTable("BaseEntity", "DefaultSchema");
16801779
1681-
b.HasDiscriminator<string>("Discriminator").HasValue("BaseEntity");
1780+
b.HasDiscriminator().HasValue("BaseEntity");
16821781
16831782
b.UseTphMappingStrategy();
16841783
});
@@ -2011,7 +2110,7 @@ public virtual void BaseType_is_stored_in_snapshot()
20112110
20122111
b.ToTable("BaseEntity", "DefaultSchema");
20132112
2014-
b.HasDiscriminator<string>("Discriminator").HasValue("BaseEntity");
2113+
b.HasDiscriminator().HasValue("BaseEntity");
20152114
20162115
b.UseTphMappingStrategy();
20172116
});
@@ -2082,7 +2181,7 @@ public virtual void Discriminator_annotations_are_stored_in_snapshot()
20822181
20832182
b.ToTable("BaseEntity", "DefaultSchema");
20842183
2085-
b.HasDiscriminator<string>("Discriminator").IsComplete(true).HasValue("BaseEntity");
2184+
b.HasDiscriminator().IsComplete(true).HasValue("BaseEntity");
20862185
20872186
b.UseTphMappingStrategy();
20882187
});
@@ -2158,7 +2257,7 @@ public virtual void Converted_discriminator_annotations_are_stored_in_snapshot()
21582257
21592258
b.ToTable("BaseEntityWithStructDiscriminator", "DefaultSchema");
21602259
2161-
b.HasDiscriminator<string>("Discriminator").IsComplete(true).HasValue("Base");
2260+
b.HasDiscriminator().IsComplete(true).HasValue("Base");
21622261
21632262
b.UseTphMappingStrategy();
21642263
});
@@ -4614,7 +4713,7 @@ public virtual void Property_column_name_is_stored_in_snapshot_when_DefaultColum
46144713
46154714
b.ToTable("BarBase", "DefaultSchema");
46164715
4617-
b.HasDiscriminator<string>("Discriminator").HasValue("BarBase");
4716+
b.HasDiscriminator().HasValue("BarBase");
46184717
46194718
b.UseTphMappingStrategy();
46204719
});
@@ -4830,7 +4929,7 @@ public virtual void Property_column_name_on_specific_table_is_stored_in_snapshot
48304929
48314930
b.ToTable("BaseEntity", "DefaultSchema");
48324931
4833-
b.HasDiscriminator<string>("Discriminator").HasValue("BaseEntity");
4932+
b.HasDiscriminator().HasValue("BaseEntity");
48344933
48354934
b.UseTphMappingStrategy();
48364935
});
@@ -7090,7 +7189,7 @@ public virtual void Do_not_generate_entity_type_builder_again_if_no_foreign_key_
70907189
70917190
b.ToTable("BaseType", "DefaultSchema");
70927191
7093-
b.HasDiscriminator<string>("Discriminator").HasValue("BaseType");
7192+
b.HasDiscriminator().HasValue("BaseType");
70947193
70957194
b.UseTphMappingStrategy();
70967195
});

0 commit comments

Comments
 (0)