c# - 在 OnModelCreating 中撤消 HasIndex

标签 c# entity-framework asp.net-identity ef-fluent-api

我正在尝试使用 Identity Framework Core 配置 Multi-Tenancy 应用程序。

我已使用此处的说明成功创建了一个自定义 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() 调用中创建的索引,但找不到执行此操作的方法。

有没有办法从模型构建器中删除在模型创建链上进一步创建的索引?

最佳答案

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

关于c# - 在 OnModelCreating 中撤消 HasIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45965811/

相关文章:

c# - 动态库仅包含元数据,没有类型

asp.net-mvc - Google OpenID 2.0 逐步淘汰 - Owin 集成

c# - 使用 C# 或 C++ 在 Windows 10 上的 Bash 上运行 GCC

c# - 连接必须有效且打开才能保存到 MySql

c# - 访问 Consumer 内的对象

c# - 删除相关实体时出现“集合已修改”错误

c# - 为什么我的 ICollection 为空?

c# - ADO.NET Entity Framework SaveChanges() 不起作用

c# - 如何设置 IdentityFactoryOptions<AppIdentityUserManager> 选项?

asp.net-mvc - 使用多个 DbContext 自动更新数据库