Override default indexes in AspNetCore.Identity tables

asp.net asp.net-core-1.1 c# ef-core-2.1 entity-framework-core


I'm developing a multi-tenant application in ASP.NET Core 2.1. I'm utilizing AspNetCore.Identity.EntityFrameworkCore framework for user management. I want to add a unique index combining NormalizedName with TenantId in Role Table. Also, in the user table NormalizedUserName with TenantId in User table.

This doesn't let me create that index since identity creates a default unique indexes for Role table RoleNameIndex and UserNameIndex for User table. What is the best way to configure that in OnModelCreating method in EF Core?

 modelBuilder.Entity<User>().HasIndex(u => new { u.NormalizedUserName, u.TenantId }).HasName("UserNameIndex").IsUnique(true);
 modelBuilder.Entity<Role>().HasIndex(u => new { u.NormalizedName, u.TenantId }).HasName("RoleNameIndex").IsUnique(true);
8/7/2018 3:00:26 PM

Accepted Answer

The fluent API currently does not provide a way to remove a previously defined index (like the indexes in question defined by the base OnModelCreating), but mutable entity metadata does via IMutableEntityType.RemoveIndex method.

It can be used like this:

modelBuilder.Entity<User>(builder =>
    builder.Metadata.RemoveIndex(new[] { builder.Property(u => u.NormalizedUserName).Metadata });

    builder.HasIndex(u => new { u.NormalizedUserName, u.TenantId }).HasName("UserNameIndex").IsUnique();

modelBuilder.Entity<Role>(builder =>
    builder.Metadata.RemoveIndex(new[] { builder.Property(r => r.NormalizedName).Metadata });

    builder.HasIndex(r => new { r.NormalizedName, r.TenantId }).HasName("RoleNameIndex").IsUnique();
8/7/2018 3:36:07 PM

Popular Answer

Don't think you can actually, unless you don't call base.OnModelCreating in your override. However, you'd then be responsible for all the Identity fluent config. You can see what you're dealing with here on Github.

The only thing to be aware of, if you go down that path, is that you'll need to watch for changes to the fluent config and make sure you add those into yours as they are introduced.

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow