Problem Statement: In our project, we use code first approach to generate migrations. I see one feature which I couldn’t control through Fluent API.
EF core is generating indexes on foreign keys. I see this as default behavior but I always like to have control in creating indexes.
Current Frameworks:
Asp.Net Core 2.2 API with EF Core.
Solution 1:
I can go and delete unwanted indexes after every migration is generated but this manual step might be missed one day, so I started looking for automating this.
Solution 2:
I found EF core configuration has given the option to replace one of its core services, so I tried to remove the Foreign Key Index convention.
| public static IServiceCollection InitDatabaseContext(this IServiceCollection services, string connectionString) | |
| { | |
| services.AddDbContext<AppDbContext>(opts => | |
| { | |
| opts.UseSqlServer(connectionString); | |
| opts.ReplaceService<IConventionSetBuilder, CustomSetBuilder>(); | |
| }); | |
| return services; | |
| } | |
| public class CustomSetBuilder : SqlServerConventionSetBuilder | |
| { | |
| public CustomSetBuilder(RelationalConventionSetBuilderDependencies dependencies, ISqlGenerationHelper sqlGenerationHelper) : base(dependencies, sqlGenerationHelper) | |
| { | |
| } | |
| public override ConventionSet AddConventions(ConventionSet conventionSet) | |
| { | |
| var et = conventionSet.ForeignKeyAddedConventions.FirstOrDefault(f => f is ForeignKeyIndexConvention); | |
| if (et != null) | |
| conventionSet.ForeignKeyAddedConventions.Remove(et); | |
| return base.AddConventions(conventionSet); | |
| } | |
| } |
Testing:
I did generate a migration for my project with default conventions and then did generate migration after removing this convention. I am 100% convinced that this convention affected only default index creation for all foreign keys.
Note: Please test thoroughly before you add this to your project.
Have fun!