2016-11-20 36 views
0

我試圖使用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(); 
    } 
} 

當我添加一個遷移,這絕對沒有影響 - 但是,如果我重命名索引它創建遷移!是否可以重寫索引?

回答

1

我有同樣的問題,我設法解決這個問題的唯一方法是完全重寫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");