EF7 IdentityDbContext迁移修改索引
问题描述:
我试图使用aspnetcore标识来做多租户,但是我遇到了麻烦,试图修改“UserNameIndex”唯一索引以包含tenantid。EF7 IdentityDbContext迁移修改索引
我可以看到我想要修改的指数是以下(这是从Microsoft.AspNetCore.Identity.EntityFrameworkCore/IdentityDbContext.cs)
b.HasIndex(u => u.NormalizedUserName).HasName("UserNameIndex").IsUnique();
这里是我的DbContext提取
public class MyContext : IdentityDbContext<Customer, CustomerRole, int>
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Customer>().HasIndex(i => new { i.NormalizedUserName, i.TenantId }).HasName("UserNameIndex").IsUnique();
}
}
当我添加一个迁移,这绝对没有影响 - 但是,如果我重命名索引它创建迁移!是否可以重写索引?
答
我有同样的问题,我设法解决这个问题的唯一方法是完全重写OnModelCreating方法。这很不幸,因为它只是我想要修改的总配置中的很少一部分。
public class MyContext : IdentityDbContext<Customer, CustomerRole, int>
{
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Customer>(b =>
{
b.HasKey(u => u.Id);
b.HasIndex(u => new { u.NormalizedUserName, u.TenantId}).HasName("UserNameIndex").IsUnique();
b.HasIndex(u => new { u.NormalizedEmail, u.TenantId}).HasName("EmailIndex");
b.ToTable("AspNetUsers");
b.Property(u => u.ConcurrencyStamp).IsConcurrencyToken();
b.Property(u => u.UserName).HasMaxLength(256);
b.Property(u => u.NormalizedUserName).HasMaxLength(256);
b.Property(u => u.Email).HasMaxLength(256);
b.Property(u => u.NormalizedEmail).HasMaxLength(256);
b.HasMany((u => u.Claims)).WithOne().HasForeignKey(uc => uc.UserId).IsRequired();
b.HasMany((u => u.Logins)).WithOne().HasForeignKey(ul => ul.UserId).IsRequired();
b.HasMany((u => u.Roles)).WithOne().HasForeignKey(ur => ur.UserId).IsRequired();
});
builder.Entity<CustomerRole>(b =>
{
b.HasKey(r => r.Id);
b.HasIndex(r => new { r.NormalizedName, r.TenantId}).HasName("RoleNameIndex");
b.ToTable("AspNetRoles");
b.Property(r => r.ConcurrencyStamp).IsConcurrencyToken();
b.Property(u => u.Name).HasMaxLength(256);
b.Property(u => u.NormalizedName).HasMaxLength(256);
b.HasMany(r => r.Users).WithOne().HasForeignKey(ur => ur.RoleId).IsRequired();
b.HasMany(r => r.Claims).WithOne().HasForeignKey(rc => rc.RoleId).IsRequired();
});
builder.Entity<IdentityUserClaim<int>>(b =>
{
b.HasKey(uc => uc.Id);
b.ToTable("AspNetUserClaims");
});
builder.Entity<IdentityRoleClaim<int>>(b =>
{
b.HasKey(rc => rc.Id);
b.ToTable("AspNetRoleClaims");
});
builder.Entity<IdentityUserRole<int>>(b =>
{
b.HasKey(r => new
{
r.UserId, r.RoleId
});
b.ToTable("AspNetUserRoles");
});
builder.Entity<IdentityUserLogin<int>>(b =>
{
b.HasKey(l => new
{
l.LoginProvider, l.ProviderKey
});
b.ToTable("AspNetUserLogins");
});
builder.Entity<IdentityUserToken<int>>(b =>
{
b.HasKey(l => new
{
l.UserId, l.LoginProvider, l.Name
});
b.ToTable("AspNetUserTokens");
});
}
}
不要忘记更新/重新生成迁移。
请注意,我还有每个租户的角色,所以我也更改了RoleNameIndex。如果你不想要的话,只需将该行改为:
b.HasIndex(r => r.NormalizedName).HasName("RoleNameIndex");