在每件事之前我應該??說:“為什么以前很容易的事情現在變得如此困難!!!! ”
我Class Library為我的 EF 資料背景關系創建了一個專案。我想用Identity也。所以我創建這樣的背景關系類:
public class Context : IdentityDbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Server=.;Database=MyDB1;Trusted_Connection=True;");
base.OnConfiguring(optionsBuilder);
}
}
我添加遷移和更新資料庫。所以我想寫一些代碼來向角色表中添加一個角色并使用RoleManager<IdentityRole>::
private readonly RoleManager<IdentityRole> _rolesManager;
public RoleRepository()
{
_rolesManager = new RoleManager<IdentityRole>();
}
public async Task AddRole(string roleName)
{
var role = new IdentityRole();
role.Name = roleName;
await _roleManager.CreateAsync(role);
}
問題是我無法實體化RoleManager<IdentityRole>,我收到此錯誤:
沒有給出對應于 'RoleManager.RoleManager(IRoleStore, IEnumerable<IRoleValidator>, ILookupNormalizer, IdentityErrorDescriber, ILogger<RoleManager>)' 的所需形式引數 'store' 的引數
從實體化時如何添加此引數RoleManager<IdentityRole>?
如何在類別庫專案中添加角色到角色表?
謝謝
uj5u.com熱心網友回復:
試試這個。
使用 (var context = new ApplicationDbContext()) { var roleManager = new RoleManager(new RoleStore(context));
var role = new IdentityRole(RoleName);
var result = await roleManager.RoleExistsAsync(RoleName);
if (!result)
{
await roleManager.CreateAsync(role);
}
}
uj5u.com熱心網友回復:
我建議你RoleManager在啟動時注冊依賴注入,然后在控制器中注入
services.AddIdentity<IdentityUser, IdentityRole>(option =>
{
option.Password.RequireDigit = false;
option.Password.RequiredLength = 4;
option.Password.RequireLowercase = false;
option.Password.RequireNonAlphanumeric = false;
option.Password.RequireUppercase = false;
})
.AddSignInManager<SignInManager<IdentityUser>>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddRoleValidator<RoleValidator<IdentityRole>>()
.AddEntityFrameworkStores<NgAppDbContext>();
然后你可以在你的控制器級別或服務級別注入,就像這樣
public class SeedDatabase
{
private readonly UserManager<IdentityUser> userManager;
private readonly RoleManager<IdentityRole> roleManager;
public SeedDatabase(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager,
IStoreSettingRepository settingRepository)
{
this.userManager = userManager;
this.roleManager = roleManager;
}
public void SeedUsers()
{
if (!userManager.Users.Any())
{
var roles = new List<Role>
{
new Role {Name = AppConst.UserRole},
new Role {Name = AppConst.AdminRole},
};
foreach (var role in roles)
{
roleManager.CreateAsync(role).Wait();
}
var adminUser = new User { UserName = AppConst.AdminUser, Email = AppConst.AdminUser};
IdentityResult result = userManager.CreateAsync(adminUser, AppConst.AdminPass).Result;
if (result.Succeeded)
{
var admin = userManager.FindByNameAsync(AppConst.AdminUser).Result;
userManager.AddToRolesAsync(admin, new[] { AppConst.AdminRole }).Wait();
}
}
}
public void Migration(IApplicationBuilder applicationBuilder)
{
using var serviceScope = applicationBuilder.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope();
var context = serviceScope.ServiceProvider.GetService<NgAppDbContext>();
SeedUsers();
context.Database.Migrate();
}
}
我有一個開源專案 - 如果你需要幫助,你也可以檢查 repo(雖然它是用 .NET 3.1 撰寫的,但概念應該是相同的,因為我對 .NET 5 也使用了相同的概念) - https://github.com/MicroAsif/user-management-with-.net-core-and-angular
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347645.html
標籤:C# 实体框架 asp.net核心 .net-5 类库
上一篇:決議命令列時出錯:無法識別的選項“--wiredTigerCacheSizeGB2”
下一篇:獲取毫秒圖令牌失敗
