Это немного усложняло, потому что я не мог изменить оригинальное. net каркасное приложение ....
Вот ситуация в старом. net каркасном проекте: у меня есть profile
класс наследует от IdentityUser
.
public class Profile : IdentityUser { ... }
Тогда OnModelCreating
У меня есть это
var baseProfile = modelBuilder.Entity<IdentityUser>().ToTable("BaseProfile");
modelBuilder.Entity<Profile>().ToTable("Profile");
modelBuilder.Entity<IdentityUserRole>().ToTable("ProfileRoleAssociation");
modelBuilder.Entity<IdentityUserLogin>().ToTable("ProfileLoginAssociation");
modelBuilder.Entity<IdentityUserClaim>().ToTable("ProfileClaimAssociation");
modelBuilder.Entity<IdentityRole>().ToTable("ProfileRole");
Итак, это была начальная ситуация, которую я не мог изменить.
Что ж, в моем новом базовом проекте. net я запустил эту команду в PackageManager Console
:
Scaffold-DbContext -Connection {connection_string} -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context MyContext -Tables "Profile", "BaseProfile", <other_tables>
Примечание BaseProfile
не является сущностью в. net framework. И обратите внимание, что по какой-то причине команда не генерирует свойства, определенные в классе IdentityUser
. Итак, я изменил автоматически сгенерированный класс следующим образом:
public partial class BaseProfile : IdentityUser
{
public override string Id { get; set; }
public override string Email { get; set; }
public override bool EmailConfirmed { get; set; }
public override string PasswordHash { get; set; }
public override string SecurityStamp { get; set; }
public override string PhoneNumber { get; set; }
public override bool PhoneNumberConfirmed { get; set; }
public override bool TwoFactorEnabled { get; set; }
public DateTime? LockoutEndDateUtc { get; set; }
public override bool LockoutEnabled { get; set; }
public override int AccessFailedCount { get; set; }
public override string UserName { get; set; }
public override string NormalizedEmail { get { return this.Email.ToUpperInvariant(); } }
public override string NormalizedUserName { get { return this.UserName.ToUpperInvariant(); } }
public virtual Profile Profile { get; set; }
}
Я изменил BaseProfile
, чтобы он наследовал от IdentityUser
. Все свойства, автоматически сгенерированные командой scaffolding и определенные в классе IdentityUser
, были переопределены. Не удаляйте их, даже если они определены в IdentityUser
и не будут привязаны к базе данных. Я также создал два новых свойства:
public override string NormalizedEmail { get { return this.Email.ToUpperInvariant(); } }
public override string NormalizedUserName { get { return this.UserName.ToUpperInvariant(); } }
Normalized*
свойств, которые не существуют в старой версии MS Identity. Но они необходимы для нового. Эти два свойства должны позволить пользователям войти в систему. Фактически вход пользователя при входе в систему сравнивается с этими двумя свойствами. Ну, это не самая правильная реализация этих свойств. Но с моей культурой все в порядке.
Наконец, OnModelCreating
Я добавил эти строки:
modelBuilder.Entity<BaseProfile>(entity =>
{
entity.ToTable("BaseProfile");
entity.Ignore(e => e.LockoutEnd);
entity.Ignore(e => e.ConcurrencyStamp);
entity.Ignore(e => e.NormalizedEmail);
entity.Ignore(e => e.NormalizedUserName);
entity.Ignore(e => e.LockoutEnd);
});
Это свойства не в старой версии Identity, а только в новой.