Моя настройка
В настоящее время у меня есть две модели, которые наследуются от ApplicationUser
, который наследует IdentityUser
.Пользовательские классы:
public abstract class ApplicationUser : IdentityUser
{
[PersonalData]
public string FirstName { get; set; }
[PersonalData]
public string LastName { get; set; }
[NotMapped]
public string FullName => $"{FirstName} {LastName}";
}
public class StudentUser : ApplicationUser
{
[PersonalData]
[Required]
public string StudentNumber { get; set; }
// A user belongs to one group
public Group Group { get; set; }
}
public class EmployeeUser : ApplicationUser { }
ApplicationUser
содержит общих свойств, таких как Имя и Фамилия.И StudentUser
, и EmployeeUser
имеют свои собственные свойства и отношения.Эта структура соответствует наследованию Table Per Hierarchy (TPH) .
В идеале я хочу следовать наследованию Table Per Type (TPT) , потому что структура SQL лучше.ASP.NET Core изначально поддерживает только TPH, поэтому я использую подход TPT.
Проблема
Я добавил службу идентификации в Startup.cs
:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Когда я звоню UserManager<StudentUser>
или UserManager<EmployeeUser>
, я получаю следующую ошибку:
Нет службы для типа 'Microsoft.AspNetCore.Identity.UserManager`1 [ClassroomMonitor.Models.StudentUser] 'был зарегистрирован.
Мой вопрос
К сожалению, я не могу найти много об этой ошибке в сочетании с этой реализацией.
Можно ли (даже) заставить это работать таким образом?
Любая помощь или мысли приветствуются.
Обновление 1
Ручное добавление StudentUser
или EmployeeUser
в качестве сервисов с заданной областью не работает (упоминается как первый ответ ).
services.AddScoped<UserManager<ApplicationUser>, UserManager<ApplicationUser>>();
// or..
services.AddScoped<UserManager<ApplicationUser>>();
Выдает следующую ошибку:
InvalidOperationException: невозможно разрешить службу для типа 'Microsoft.AspNetCore.Identity.IUserStore1 [ClassroomMonitor.Models.StudentUser]'
Обновление 2
Вот Gist , чтобы дать вам более полное представление о структуре проекта: