覆盖 AspNetCore.Identity 表中的默认索引

Aru*_*una 8 c# asp.net entity-framework-core asp.net-core-1.1 ef-core-2.1

我正在开发一个多租户应用程序ASP.NET Core 2.1。我正在使用AspNetCore.Identity.EntityFrameworkCore用户管理框架。我想添加一个唯一索引结合NormalizedName使用TenantIdRole表。此外,在用户表NormalizedUserNameTenantIdUser表中。

这不允许我创建该索引,因为身份为 Role 表RoleNameIndexUserNameIndexUser 表创建了默认的唯一索引。OnModelCreating在 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);
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 14

fluent API 目前不提供删除先前定义的索引(如 base 定义的有问题的索引OnModelCreating)的方法,但可变实体元数据可以通过IMutableEntityType.RemoveIndex方法删除。

它可以像这样使用:

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();
});
Run Code Online (Sandbox Code Playgroud)