Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EF7 > Migrations are wrong when having the same property name in multiple child classes #29953

Closed
ErazerBrecht opened this issue Dec 31, 2022 · 2 comments

Comments

@ErazerBrecht
Copy link

ErazerBrecht commented Dec 31, 2022

EF7 > Migrations are wrong when having the same property name in multiple child classes

There is a problem in EF7 when you use TPH.
If you have a root class that has two children and both those children have the same property names EF7 fails to create a correct migration.

It will try to map those properties to a separate table but without a table name.

This causes the migration to:

  • Not be executable against a DB (dotnet ef database up)
  • Not be removable (dotnet ef migrations remove)

E.g.

modelBuilder.Entity("EF7.MigrationBug.Models.ActivitySubmissionIntegrationDeletedEventDocument", b =>
                {
                    b.HasBaseType("EF7.MigrationBug.Models.ActivitySubmissionIntegrationEventDocument");

                    b.ToTable(t =>
                        {
                            t.Property("IntegrationId")
                                .HasColumnName("ActivitySubmissionIntegrationEventDocument_IntegrationId");

                            t.Property("IntegrationName")
                                .HasColumnName("ActivitySubmissionIntegrationEventDocument_IntegrationName");

                            t.Property("IntegrationType")
                                .HasColumnName("ActivitySubmissionIntegrationEventDocument_IntegrationType");
                        });

                    b.HasDiscriminator().HasValue("ActivitySubmissionIntegrationDeletedEventDocument");
                });

Include your code

Repository: https://github.com/ErazerBrecht/EF7-Bug

In this PR: ErazerBrecht/EF7-Bug#1 you see the differences between EF6 & EF7 migration.

Include stack traces

System.InvalidOperationException: Table name must be specified to configure a table-specific property mapping.
   at Microsoft.EntityFrameworkCore.Metadata.Builders.TableBuilder.GetStoreObjectIdentifier()
   at Microsoft.EntityFrameworkCore.Metadata.Builders.TableBuilder.Property(String propertyName)
   at EF7.MigrationBug.Migrations.Init.<>c.<BuildTargetModel>b__2_9(TableBuilder t) in C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\Migrations\20221231100512_Init.Designer.cs:line 123
   at Microsoft.EntityFrameworkCore.RelationalEntityTypeBuilderExtensions.ToTable(EntityTypeBuilder entityTypeBuilder, Action`1 buildAction)
   at EF7.MigrationBug.Migrations.Init.<>c.<BuildTargetModel>b__2_6(EntityTypeBuilder b) in C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\Migrations\20221231100512_Init.Designer.cs:line 121
   at Microsoft.EntityFrameworkCore.ModelBuilder.Entity(String name, Action`1 buildAction)
   at EF7.MigrationBug.Migrations.Init.BuildTargetModel(ModelBuilder modelBuilder) in C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\Migrations\20221231100512_Init.Designer.cs:line 108
   at Microsoft.EntityFrameworkCore.Migrations.Migration.<get_TargetModel>g__Create|5_0()
   at Microsoft.EntityFrameworkCore.Migrations.Migration.get_TargetModel()
   at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force, String language)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.RemoveMigration(String contextType, Boolean force)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.RemoveMigrationImpl(String contextType, Boolean force)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.RemoveMigration.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Table name must be specified to configure a table-specific property mapping.

Include verbose output

PS C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug> dotnet ef migrations remove --verbose
Using project 'C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\EF7.MigrationBug.csproj'.
Using startup project 'C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\EF7.MigrationBug.csproj'.
Writing 'C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\obj\EF7.MigrationBug.csproj.EntityFrameworkCore.targets'...
dotnet msbuild /target:GetEFProjectMetadata /property:EFProjectMetadataFile=C:\Users\Brecht\AppData\Local\Temp\tmpE12.tmp /verbosity:quiet /nologo C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\EF7.MigrationBug.csproj
Writing 'C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\obj\EF7.MigrationBug.csproj.EntityFrameworkCore.targets'...
dotnet msbuild /target:GetEFProjectMetadata /property:EFProjectMetadataFile=C:\Users\Brecht\AppData\Local\Temp\tmp1026.tmp /verbosity:quiet /nologo C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\EF7.MigrationBug.csproj
Build started...
dotnet build C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\EF7.MigrationBug.csproj /verbosity:quiet /nologo

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.07
Build succeeded.
dotnet exec --depsfile C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\bin\Debug\net7.0\EF7.MigrationBug.deps.json --additionalprobingpath C:\Users\Brecht\.nuget\packages --additionalprobingpath "C:\Program Files\dotnet\sdk\NuGetFallbackFolder" --runtimeconfig C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.Mi
grationBug\bin\Debug\net7.0\EF7.MigrationBug.runtimeconfig.json C:\Users\Brecht\.dotnet\tools\.store\dotnet-ef\7.0.1\dotnet-ef\7.0.1\tools\net6.0\any\tools\netcoreapp2.0\any\ef.dll migrations remove --assembly C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\bin\Debug\net7.0\EF7.MigrationBug.dll --project
 C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\EF7.MigrationBug.csproj --startup-assembly C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\bin\Debug\net7.0\EF7.MigrationBug.dll --startup-project C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\EF7.MigrationBug.csproj --project-dir C:\Intigr
iti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\ --root-namespace EF7.MigrationBug --language C# --framework net7.0 --working-dir C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug --verbose
Using assembly 'EF7.MigrationBug'.
Using startup assembly 'EF7.MigrationBug'.
Using application base 'C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\bin\Debug\net7.0'.
Using working directory 'C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug'.
Using root namespace 'EF7.MigrationBug'.
Using project directory 'C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\'.
Remaining arguments: .
Finding DbContext classes...
Finding IDesignTimeDbContextFactory implementations...
Finding application service provider in assembly 'EF7.MigrationBug'...
Finding Microsoft.Extensions.Hosting service provider...
No static method 'CreateHostBuilder(string[])' was found on class 'Program'.
No application service provider was found.
Finding DbContext classes in the project...
Found DbContext 'DbCtx'.
Using context 'DbCtx'.
Finding design-time services referenced by assembly 'EF7.MigrationBug'...
Finding design-time services referenced by assembly 'EF7.MigrationBug'...
No referenced design-time services were found.
Finding design-time services for provider 'Npgsql.EntityFrameworkCore.PostgreSQL'...
Using design-time services from provider 'Npgsql.EntityFrameworkCore.PostgreSQL'.
Finding IDesignTimeServices implementations in assembly 'EF7.MigrationBug'...
No design-time services were found.
The property 'ActivityEventDocument.Discriminator' was created in shadow state because there are no eligible CLR members with a matching name.
'DbCtx' disposed.
System.InvalidOperationException: Table name must be specified to configure a table-specific property mapping.
   at Microsoft.EntityFrameworkCore.Metadata.Builders.TableBuilder.GetStoreObjectIdentifier()
   at Microsoft.EntityFrameworkCore.Metadata.Builders.TableBuilder.Property(String propertyName)
   at EF7.MigrationBug.Migrations.Init.<>c.<BuildTargetModel>b__2_9(TableBuilder t) in C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\Migrations\20221231100842_Init.Designer.cs:line 123

                                                                                                                                                                                                         at Microsoft.EntityFrameworkCore.ModelBuilder.Entity(String name, Action`1 buildAction)
   at EF7.MigrationBug.Migrations.Init.BuildTargetModel(ModelBuilder modelBuilder) in C:\Intigriti\POC\EF7\EF7.MigrationBug\EF7.MigrationBug\Migrations\20221231100842_Init.Designer.cs:line 108
   at Microsoft.EntityFrameworkCore.Migrations.Migration.<get_TargetModel>g__Create|5_0()
   at Microsoft.EntityFrameworkCore.Migrations.Migration.get_TargetModel()
   at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force, String language)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.RemoveMigration(String contextType, Boolean force)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.RemoveMigrationImpl(String contextType, Boolean force)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.RemoveMigration.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Table name must be specified to configure a table-specific property mapping.

Include provider and version information

EF Core version: 7.0.1
Database provider: Npgsql.EntityFrameworkCore.PostgreSQL
Target framework: NET 7.0
Operating system: Win 10
IDE: JetBrains Rider 2022.2.4

@ajcvickers
Copy link
Member

Duplicate of #29534. Verified fixed with latest daily build.

@ErazerBrecht
Copy link
Author

ErazerBrecht commented Jan 3, 2023

@ajcvickers Thx, tried to search for a similar one but couldn't find it.
So thx for duping me.

Will close this issue since it's indeed fixed in the daily build!

Sincerely,
Brecht

@ajcvickers ajcvickers closed this as not planned Won't fix, can't repro, duplicate, stale Jan 3, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants