在 OnModelCreating 中撤消 HasIndex

Posted

技术标签:

【中文标题】在 OnModelCreating 中撤消 HasIndex【英文标题】:Undo HasIndex in OnModelCreating 【发布时间】:2018-02-08 11:40:44 【问题描述】:

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

'User' 上的索引 'NormalizedUserName', 'TenantId' 和 'User' 上的 'NormalizedUserName' 都映射到 'Security.AspNetUser.UserNameIndex' 但具有不同的列('NormalizedUserName', ' TenantId' 和 'NormalizedUserName')。

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

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

【问题讨论】:

【参考方案1】:

我在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();
    );

【讨论】:

谢谢。你用这个救了我!!

以上是关于在 OnModelCreating 中撤消 HasIndex的主要内容,如果未能解决你的问题,请参考以下文章

在依赖注入中使用 Entity Framework Core DbContext 时不调用 OnModelCreating

如何在 EntityFramework Core 中使用部分类和部分 OnModelCreating 方法扩展 DbContext

在 ASP.NET MVC 中引发了 OnModelCreating 类型的“System.***Exception”异常

EF Core:检查 OnModelCreating 中是不是存在列以忽略属性

EF核心实体配置未在OnModelCreating中应用

实体框架逆向工程 OnModelCreating