NikFaraday
@NikFaraday
Student full-stack Developer

Конфигурация asp.net Identity под существующую базу данных?

На проекте мигрировалась база данных, которая когда-то использовалась с asp.net Identity. Иными словами, подход Database First. В базе данных уже существуют все необходимые колонки, которые предоставляет сам asp.net Identity.

67349d457a934517824187.png

Я сделал partial класс для AspNetUser1, которые наследуется от IdentityUser и, аналогично, для AspNetRole1:

public partial class AspNetUser1 : IdentityUser { }
public partial class AspNetRole1 : IdentityRole { }


Во второй части partial класса находятся связи с другими таблицами. Для контекста несколько вариантов:

  • public partial class AppDbContext : IdentityDbContext<AspNetUser1>

  • public partial class AppDbContext : IdentityDbContext<AspNetUser1, AspNetRole1, string>

  • public partial class AppDbContext : IdentityDbContext<AspNetUser1, IdentityRole, string>



Конфигурация самого asp.net Identity выглядит вот так:

services.AddIdentity<AspNetUser1, IdentityRole>(options =>
{
    options.SignIn.RequireConfirmedPhoneNumber = false;
    options.SignIn.RequireConfirmedEmail = false;
    options.SignIn.RequireConfirmedAccount = false;
})
.AddEntityFrameworkStores<AppDbContext>();

services.Configure<IdentityOptions>(options =>
{
    // ...
}


Проблема заключается в том, что при запуске проекта получаю ошибку:

System.InvalidOperationException: 'The entity type 'IdentityUserLogin<string>' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943.'


То есть, ругается вообще на AspNetUserLogin. Тут стоит уточнить, что таблица не изменялась и имеет вид, которые предоставляется сам asp.net Identity. Проблема заключается скорее всего в конфигурации это таблицы, а именно, что Identity требует от неё primary key типа string:

public partial class AspNetUserLoginConfiguration : IEntityTypeConfiguration<AspNetUserLogin>
{
    public void Configure(EntityTypeBuilder<AspNetUserLogin> entity)
    {
        entity.HasKey(e => new { e.LoginProvider, e.ProviderKey });

        // ...
    }
}


Как говорил ранее, это старая БД, которая писалась под asp.net Identity, но сама конфигурация является auto generate кодом, который регулярно перегенерывается. Как вообще это всё лечить?

UPD:
Сам AspNetUserLogin выглядит вот так:

public partial class AspNetUserLogin
{
    public string LoginProvider { get; set; }

    public string ProviderKey { get; set; }

    public string ProviderDisplayName { get; set; }

    public string UserId { get; set; }

    public virtual AspNetUser1 User { get; set; }
}


И так же да, я пробовал наследовать его от IdentityUserLogin<string>, но это не дали вообще никаких результатов. Как создать оптимальную конфигурацию, что бы оно хотя бы запустилось?
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы