diff --git a/src/EFCore/Metadata/IReadOnlyTypeBase.cs b/src/EFCore/Metadata/IReadOnlyTypeBase.cs index 899a072c25a..9aa78564c5f 100644 --- a/src/EFCore/Metadata/IReadOnlyTypeBase.cs +++ b/src/EFCore/Metadata/IReadOnlyTypeBase.cs @@ -117,6 +117,11 @@ string ShortName() if (!HasSharedClrType) { var name = ClrType.ShortDisplayName(); + if (name.StartsWith("<>", StringComparison.Ordinal)) + { + name = name[2..]; + } + var lessIndex = name.IndexOf("<", StringComparison.Ordinal); if (lessIndex == -1) { diff --git a/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs b/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs index 3be955d862e..371de95e294 100644 --- a/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs +++ b/test/EFCore.Tests/Metadata/Internal/EntityTypeTest.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using System.Globalization; +using System.Reflection.Emit; // ReSharper disable CollectionNeverUpdated.Local // ReSharper disable UnusedAutoPropertyAccessor.Local @@ -2959,6 +2960,56 @@ public void Collections_dont_have_relationship_indexes_when_full_notifications_w Assert.Equal(3, entityType.RelationshipPropertyCount()); } + [ConditionalFact] + public void ShortName_on_compiler_generated_type1() + { + var model = CreateModel(); + + var typeName = "<>f__AnonymousType01Child"; + model.AddEntityType(typeName); + var entityType = model.FinalizeModel().FindEntityType(typeName); + + Assert.Equal(typeName, entityType.ShortName()); + } + + [ConditionalFact] + public void ShortName_on_compiler_generated_type2() + { + var model = CreateModel(); + + var typeName = "<>f__AnonymousType01Child"; + var assemblyName = new AssemblyName("DynamicEntityClrTypeAssembly"); + var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule"); + var typeBuilder = moduleBuilder.DefineType(typeName); + var type = typeBuilder.CreateType(); + + model.AddEntityType(type); + + var entityType = model.FinalizeModel().FindEntityType(typeName); + + Assert.Equal(typeName[2..], entityType.ShortName()); + } + + [ConditionalFact] + public void ShortName_on_compiler_generated_type3() + { + var model = CreateModel(); + + var typeName = "<>__AnonymousType01Child"; + var assemblyName = new AssemblyName("DynamicEntityClrTypeAssembly"); + var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule"); + var typeBuilder = moduleBuilder.DefineType(typeName); + var type = typeBuilder.CreateType(); + + model.AddEntityType(type); + + var entityType = model.FinalizeModel().FindEntityType(typeName); + + Assert.Equal("__AnonymousType01Child", entityType.ShortName()); + } + private readonly IMutableModel _model = BuildModel(); private IMutableEntityType DependentType