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

Override default indexes in AspNetCore.Identity tables

我正在 ASP.NET Core 2.1 开发多租户应用程序。我正在使用 AspNetCore.Identity.EntityFrameworkCore 框架进行用户管理。我想在 Role Table 中添加一个 唯一索引 组合 NormalizedNameTenantId。此外,在用户 table NormalizedUserNameTenantIdUser table 中。

这不允许我创建该索引,因为身份会为角色 table RoleNameIndex 和用户 table 创建默认的唯一索引。在 EF Core 的 OnModelCreating 方法中配置它的最佳方法是什么?

 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);

别以为你真的可以,除非你不在覆盖中调用 base.OnModelCreating。但是,您将负责所有 Identity fluent 配置。你可以看到你在处理什么 here on Github.

唯一要注意的是,如果您沿着这条路走下去,您将需要注意对流畅配置的更改,并确保在引入它们时将它们添加到您的配置中。

fluent API 目前不提供删除先前定义的索引的方法(如由基础 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();
});