Sql Исключение: недопустимое имя столбца "NormalizedUserName ..." в существующем. net идентификатор платформы, используемый в. net базовый проект - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть проект в. Net Framework. Я использую. Net Framework и. Net Framework Asp. net Идентичность. Здесь нет проблем ...

Сейчас я создаю новый проект. Это. Net Core 2.2 Project, который должен подключаться к существующей базе данных. Я не могу изменить структуру базы данных. Я создал базу данных с помощью этой команды

Scaffold-DbContext -Connection "..." -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context MyDatabaseContext -Tables "Profile", <other_tables_no_identity> 

Итак, база данных была создана, затем я вручную изменил следующие файлы

  1. Я добавил IdentityUser в Profile сущность
   public partial class Profile : IdentityUser {...}
Я изменил OnModelCreating таким образом:
 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
     //I have added this lines
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<IdentityUser>(entity =>
     {
         entity.ToTable("BaseProfile");

         entity.Property(e => e.Id)
                 .HasMaxLength(128)
                 .ValueGeneratedNever();

         entity.Property(e => e.Email)
                 .IsRequired()
                 .HasMaxLength(256);

         entity.Property(e => e.UserName)
                 .IsRequired()
                 .HasMaxLength(256);
         });

     modelBuilder.Entity<Profile>(entity =>
     {
         entity.ToTable("Profile");

         entity.HasIndex(e => e.Id)
                 .HasName("IX_Id");

         entity.Property(e => e.Id)
                 .HasMaxLength(128)
                 .ValueGeneratedNever();

         entity.Property(e => e.CreationDate).HasColumnType("datetime");

         entity.Property(e => e.LastAccessDate).HasColumnType("datetime");

         entity.Property(e => e.Rating).HasColumnType("decimal(18, 2)");
     });

     modelBuilder.Entity<IdentityUserRole<string>>().ToTable("ProfileRoleAssociation");
     modelBuilder.Entity<IdentityUserLogin<string>>().ToTable("ProfileLoginAssociation");
     modelBuilder.Entity<IdentityUserClaim<int>>().ToTable("ProfileClaimAssociation");
     modelBuilder.Entity<IdentityRole>().ToTable("ProfileRole");


 }

Я скопировал эти строки из старого. Net Framework-проекта ... Но когда я пытаюсь сделать логин Я получаю эту ошибку:

Произошло необработанное исключение при обработке запроса. SqlException: недопустимое имя столбца «NormalizedUserName». Неверное имя столбца 'AccessFailedCount'. Неверное имя столбца 'ConcurrencyStamp'. Неверное имя столбца 'Email'. Неверное имя столбца 'EmailConfirmed'. Неверное имя столбца 'LockoutEnabled'. Неверное имя столбца 'LockoutEnd'. Неверное имя столбца «NormalizedEmail». Неверное имя столбца «NormalizedUserName». Неверное имя столбца 'PasswordHa sh'. Неверное имя столбца 'PhoneNumber'. Неверное имя столбца 'PhoneNumberConfirmed'. Неверное имя столбца «SecurityStamp». Неверное имя столбца 'TwoFactorEnabled'. Неверное имя столбца 'Имя пользователя'.

Имя столбца NormalizedUserName не существует. Но остальные да.

enter image description here

Что не так? Спасибо

РЕДАКТИРОВАТЬ

Я понял, что проблема заключается в наследовании. Он ищет столбцы внутри Profile таблицы вместо BaseProfile ... но я до сих пор не понимаю, как ее решить.

1 Ответ

0 голосов
/ 01 мая 2020

Это немного усложняло, потому что я не мог изменить оригинальное. 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, а только в новой.

...