覆盖 AspNetCore.Identity 个表中的默认索引
Override default indexes in AspNetCore.Identity tables
我正在 ASP.NET Core 2.1
开发多租户应用程序。我正在使用 AspNetCore.Identity.EntityFrameworkCore
框架进行用户管理。我想在 Role
Table 中添加一个 唯一索引 组合 NormalizedName
和 TenantId
。此外,在用户 table NormalizedUserName
中 TenantId
在 User
table 中。
这不允许我创建该索引,因为身份会为角色 table RoleNameIndex
和用户 table 创建默认的唯一索引。在 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);
别以为你真的可以,除非你不在覆盖中调用 base.OnModelCreating
。但是,您将负责所有 Identity fluent 配置。你可以看到你在处理什么 here on Github.
唯一要注意的是,如果您沿着这条路走下去,您将需要注意对流畅配置的更改,并确保在引入它们时将它们添加到您的配置中。
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();
});
我正在 ASP.NET Core 2.1
开发多租户应用程序。我正在使用 AspNetCore.Identity.EntityFrameworkCore
框架进行用户管理。我想在 Role
Table 中添加一个 唯一索引 组合 NormalizedName
和 TenantId
。此外,在用户 table NormalizedUserName
中 TenantId
在 User
table 中。
这不允许我创建该索引,因为身份会为角色 table RoleNameIndex
和用户 table 创建默认的唯一索引。在 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);
别以为你真的可以,除非你不在覆盖中调用 base.OnModelCreating
。但是,您将负责所有 Identity fluent 配置。你可以看到你在处理什么 here on Github.
唯一要注意的是,如果您沿着这条路走下去,您将需要注意对流畅配置的更改,并确保在引入它们时将它们添加到您的配置中。
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();
});