Я только что перестроил функциональность IdentityDbContext прямо в мой DbContext + предоставленные пользовательские хранилища. В этом нет никакой магии. Единственное, что делает IdentityDbContext, - это добавляет несколько наборов данных и некоторые сопоставления в ваш контекст.
Здесь вы найдете все, что вам нужно: https://github.com/aspnet/AspNetIdentity/tree/master/src/Microsoft.AspNet.Identity.EntityFramework
Мы используем Guids в качестве идентификаторов, поскольку у нас уже были пользовательские классы, такие как CustomUserLogin
, которые унаследованы от IdentityUserLogin
, поэтому я просто переместил все из базового класса в этот класс.
Одна вещь, которую вы увидите, это то, что старый код не имеет надлежащих навигационных свойств в обоих направлениях. Я добавил это, чтобы я мог к отображению, как это:
private void SetupIdentityTables(ModelBuilder modelBuilder)
{
var user = modelBuilder.Entity<ApplicationUser>()
.ToTable("AspNetUsers");
user.HasMany(u => u.Roles).WithOne().HasForeignKey(ur => ur.UserId);
user.HasMany(u => u.Claims).WithOne().HasForeignKey(uc => uc.UserId);
user.HasMany(u => u.Logins).WithOne().HasForeignKey(ul => ul.UserId);
user.Property(u => u.UserName)
.IsRequired()
.HasMaxLength(256);
user.HasIndex(x => x.UserName).HasName("UserNameIndex").IsUnique();
// CONSIDER: u.Email is Required if set on options?
user.Property(u => u.Email).HasMaxLength(256);
modelBuilder.Entity<CustomUserRole>()
.ToTable("AspNetUserRoles")
.HasKey(r => new { r.UserId, r.RoleId });
modelBuilder.Entity<CustomUserLogin>()
.ToTable("AspNetUserLogins")
.HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId });
modelBuilder.Entity<CustomUserClaim>()
.ToTable("AspNetUserClaims");
var role = modelBuilder.Entity<CustomRole>()
.ToTable("AspNetRoles");
role.Property(r => r.Name)
.IsRequired()
.HasMaxLength(256);
role.HasIndex(x => x.Name).HasName("RoleNameIndex").IsUnique();
role.HasMany(r => r.Users).WithOne().HasForeignKey(ur => ur.RoleId);
}
ПРИМЕЧАНИЕ: Этот код на самом деле не работает идеально, так как имеет некоторые проблемы с внешним ключом. Мне нужно еще раз взглянуть на сопоставления, но вы должны как минимум понять идею.