Конфигурация asp.net Identity под существующую базу данных
На проекте мигрировалась база данных, которая когда-то использовалась с asp.net Identity
. Иными словами, подход Database First
. В базе данных уже существуют все необходимые колонки, которые предоставляет сам asp.net Identity
.
Я сделал 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 string ProviderKey { get; set; }
public string ProviderDisplayName { get; set; }
public string UserId { get; set; }
public virtual AspNetUser1 User { get; set; }
}
И так же да, я пробовал наследовать его от IdentityUserLogin
, но это не дали вообще никаких результатов. Как создать оптимальную конфигурацию, что бы оно хотя бы запустилось?