【问题标题】:Override default indexes in AspNetCore.Identity tables覆盖 AspNetCore.Identity 表中的默认索引
【发布时间】:2019-01-14 17:27:27
【问题描述】:

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

这不允许我创建该索引,因为身份为角色表 RoleNameIndexUserNameIndex 为用户表创建了默认唯一索引。在 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);

【问题讨论】:

    标签: c# asp.net entity-framework-core asp.net-core-1.1 ef-core-2.1


    【解决方案1】:

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

    如果您走这条路,唯一需要注意的是,您需要注意对 fluent 配置的更改,并确保在引入这些更改时将其添加到您的配置中。

    【讨论】:

    • 是的。实际上,我正在为更改覆盖 onModel 创建方法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多