У меня есть работающее веб-приложение, в котором я пытаюсь улучшить фрагмент кода, отвечающий за импорт большого набора данных.
В этом конкретном случае мне нужно создать экземпляр a UserManager без внедрения зависимостей, чтобы использовать CreateAsyn c (), а затем AddToRoleAsyn c () .
Я сделал следующее:
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile("appsettings.Development.json", optional: true)
.AddJsonFile($"appsettings.{Environment.MachineName}.json", optional: true, reloadOnChange: true)
.Build();
var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
builder.UseSqlServer(configuration["ConnectionStrings:PsscDbConnection"], b => b.MigrationsAssembly("Devolabs.PSSC.Web"));
IUserStore<ApplicationUser> _store = new Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<ApplicationUser>(new ApplicationDbContext(builder.Options));
using (var userManager = new UserManager<ApplicationUser>(_store, null, new PasswordHasher<ApplicationUser>(), null, null, null, null, null, null))
{
...
var result = await userManager.CreateAsync(model, password);
...
model = await userManager.FindByNameAsync(model.UserName);
...
result = await userManager.AddToRolesAsync(model, roles.Distinct()); <==== Problem here
}
Мой ApplicationDbContext выглядит следующим образом:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
....
public ApplicationDbContext(DbContextOptions options) : base(options)
{ }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
С ApplicationUser и с ApplicationRole, реализующими соответственно IdentityUser и IdentityRole.
Мои пользователи создают хорошо, что означает, что у userManager есть доступ в соответствующее хранилище пользователей с помощью DbContext.
=> Моя проблема связана с userManager.AddToRolesAsyn c (model, roles.Distinct ()). Я получаю исключение: Невозможно создать DbSet для IdentityRole, потому что этот тип не включен в модель для контекста
Я считаю, что мой ApplicationDbContext - это то, что предоставляет DbSet для IdentityUser и IdentityRole, но вроде этого мало.
Другая часть приложения использует DI и зависит от конфигурации Identity:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Но здесь я пытаюсь избежать DI, чтобы иметь возможность распоряжаться своим DbContext, когда я хочу.
Вы видите, что я делаю не так? Могу ли я сделать что-нибудь, чтобы установить конфигурацию удостоверения в другом месте, кроме конфигурации DI, и иметь возможность использовать роли с моим userManager?