在 OnModelCreating 中撤消 HasIndex

Undo HasIndex in OnModelCreating

我正在尝试使用 Identity Framework Core 配置多租户应用程序。

我已经使用此处的说明成功创建了自定义 ApplicationUser 以使用 TenantId 覆盖 IdentityUser:https://www.scottbrady91.com/ASPNET-Identity/Quick-and-Easy-ASPNET-Identity-Multitenancy(这些说明不适用于 Identity Framework Core,但它们有所帮助)。

我在创建数据库表时卡住了。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Models.User>(entity =>
    {
        entity.HasIndex(a => new { a.NormalizedUserName, a.TenantId }).HasName("UserNameIndex").IsUnique();
    });
}

我的目的是替换 base.OnModelCreating() 中定义的 UserNameIndex,使其成为两列的索引,而不仅仅是 NormalizedUsername。但这只会导致错误:

The indexes {'NormalizedUserName', 'TenantId'} on 'User' and {'NormalizedUserName'} on 'User' are both mapped to 'Security.AspNetUser.UserNameIndex' but with different columns ({'NormalizedUserName', 'TenantId'} and {'NormalizedUserName'}).

显然我想撤消在 base.OnModelCreating() 调用中创建的索引,然后再将其添加到我的代码中,但找不到执行此操作的方法。

有没有办法从 ModelBuilder 中删除在模型创建链上游创建的索引?

我在 https://github.com/aspnet/EntityFrameworkCore/issues/6239

的帮助下找到了解决方案

您可以使用MetaData.RemoveIndex()删除已经存在的索引

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Models.User>(entity =>
    {
        // Added these two lines
        var index = b.HasIndex(u => new { u.NormalizedUserName }).Metadata; 
        b.Metadata.RemoveIndex(index.Properties);

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