efcore.pg icon indicating copy to clipboard operation
efcore.pg copied to clipboard

Index included properties not working with `dotnet ef dbcontext scaffold`

Open yyjdelete opened this issue 5 years ago • 5 comments

Tested with Npgsql.EntityFrameworkCore.PostgreSQL: 3.1.4(efcore3.1.10)/5.0.1 Related to #1201

Steps

  1. Create database with the code in #1201
  2. Run dotnet ef dbcontext scaffold ... Npgsql.EntityFrameworkCore.PostgreSQL
            modelBuilder.Entity<Account>(entity =>
            {
                entity.HasIndex(e => e.Id, "IX_Accounts_Id")
                    .IncludeProperties(new[] { "first_name" });

                entity.Property(e => e.FirstName).HasColumnName("first_name");
            });
  1. Change code to use the new output dbcontext, run and see

System.InvalidOperationException: 'Include property 'Account.first_name' not found'

yyjdelete avatar Dec 14 '20 09:12 yyjdelete

I have the same issue while using SQLServer. Any indexes with include properties generate that line, and none of the include properties work.

dawnthefawn avatar Jan 13 '21 23:01 dawnthefawn

@dawnthefawn AFAIK included properties aren't scaffolded by the SQL Server provider at all - can you provide more details about exactly what's going? Opening a separate issue would probably be better.

roji avatar Jan 26 '21 14:01 roji

@yyjdelete sorry for not looking at this earlier - I can confirm it's indeed a bug. The only way to fix this currently is to override EF Core's RelationalScaffoldingModelFactory (an internal service...), and to apply transformations on the include properties annotation.

I've opened https://github.com/dotnet/efcore/issues/23980 on the EF Core side to provide better support for this.

roji avatar Jan 26 '21 15:01 roji

@roji You said in your linked issue that you "may still fix this on the Npgsql side".

As we don't know how long it will take on the dotnet/efcore side that this issue is getting fixed - and i expect it to happen most likely a waay later as they also removed the consider-for-current-release lable - it would be good to get this fixed in this repo.

Here is the c# context section and stack trace from a simple dotnet ef dbcontext scaffold command.

// table name in database: sample_table, columns: first_column, second_column
entity.HasIndex(e => new { e.FirstColumn, e.SecondColumn }, "ix01_sample_table")
  .IncludeProperties(new[] { "some_fk", "other_fk" });
System.InvalidOperationException: Include property 'SampleTable.some_fk' not found
   at Npgsql.EntityFrameworkCore.PostgreSQL.Infrastructure.NpgsqlModelValidator.ValidateIndexIncludeProperties(IModel model)
   at Npgsql.EntityFrameworkCore.PostgreSQL.Infrastructure.NpgsqlModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
   at Microsoft.EntityFrameworkCore.Metadata.Conventions.ValidatingConvention.ProcessModelFinalized(IModel model)
   at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnModelFinalized(IModel model)
   at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnModelFinalized(IModel model)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.Model.FinalizeModel()
   at Microsoft.EntityFrameworkCore.ModelBuilder.FinalizeModel()
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, ModelDependencies modelDependencies)
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, IConventionSetBuilder conventionSetBuilder, ModelDependencies modelDependencies)
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
   at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_3(IServiceProvider p)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
   at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
   at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
   at Microsoft.EntityFrameworkCore.Infrastructure.Internal.InfrastructureExtensions.GetService[TService](IInfrastructure`1 accessor)
   at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor)
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
   at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>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)
Include property 'SampleTable.some_fk' not found

https://github.com/npgsql/efcore.pg/blob/099131b28bc2cf54951a2ee037f38a7afb6092a7/src/EFCore.PG/Infrastructure/NpgsqlModelValidator.cs#L74-L87

FireEmerald avatar Jun 11 '21 08:06 FireEmerald

@FireEmerald it would indeed be good to fix this, but I don't think I'll have any time soon to work on this on the Npgsql side. In general, as this is a scaffolding-only issue, it tends to be lower priority as you can always modify the model manually after it's scaffolded.

roji avatar Jun 11 '21 09:06 roji