我正在尝试使用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。但这只会导致错误:


“用户”上的索引{'NormalizedUserName','TenantId'}和'User'上的{'NormalizedUserName'}都映射到'Security.AspNetUser.UserNameIndex',但具有不同的列({'NormalizedUserName','TenantId'}和{'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();
    });
}

08-25 21:25