gpt4 book ai didi

c# - .NET Core 2.1 Identity 获取所有用户及其相关角色

转载 作者:IT老高 更新时间:2023-10-28 23:56:15 26 4
gpt4 key购买 nike

我正在尝试为用户管理页面提取我的所有身份用户及其相关角色。我认为这会相当容易,但显然不是。我尝试了以下解决方案:https://stackoverflow.com/a/43562544/5392786但到目前为止还没有成功。

这是我目前所拥有的:

应用程序用户:

public class ApplicationUser : IdentityUser
{
public List<IdentityUserRole<string>> Roles { get; set; }
}

DBContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}

启动身份代码

services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

我要在其中显示列表的 Razor 页面:

public class IndexModel : PageModel
{
private readonly UserManager<ApplicationUser> userManager;

public IndexModel(UserManager<ApplicationUser> userManager)
{
this.userManager = userManager;
}

public IEnumerable<ApplicationUser> Users { get; set; }

public void OnGetAsync()
{
this.Users = userManager.Users.Include(u => u.Roles).ToList();
}
}

调用 userManager.Users.Include(u => u.Roles).ToList(); 时出现以下错误;:

MySql.Data.MySqlClient.MySqlException: 'Unknown column 'u.Roles.ApplicationUserId' in 'field list''

最佳答案

我现在已经实现了以下解决方案。

正如 CodeNotFound 在评论中指出的那样,IdentityUser 曾经有一个 Roles属性(property)。在 .NET Core 中不再是这种情况。这comment/issue在 GitHub 上似乎是 .Net Core 的当前解决方案。我试图用以下代码实现它:

应用程序用户

public class ApplicationUser : IdentityUser
{
public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

应用程序用户角色

public class ApplicationUserRole : IdentityUserRole<string>
{
public virtual ApplicationUser User { get; set; }
public virtual ApplicationRole Role { get; set; }
}

应用角色

public class ApplicationRole : IdentityRole
{
public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

数据库上下文

public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string>,
ApplicationUserRole, IdentityUserLogin<string>,
IdentityRoleClaim<string>, IdentityUserToken<string>>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);

builder.Entity<ApplicationUserRole>(userRole =>
{
userRole.HasKey(ur => new { ur.UserId, ur.RoleId });

userRole.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();

userRole.HasOne(ur => ur.User)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
}
}

启动

services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

最后,确保在使用它时先加载用户的 UserRoles,然后再加载 UserRole 的角色,如下所示:

this.Users = userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();

我有一个问题 Role每个属性 UserRole为空,这已通过添加 .ThenInclude(ur => ur.Role) 解决部分。

有关多级预先加载的 Microsoft 文档:https://learn.microsoft.com/en-us/ef/core/querying/related-data#including-multiple-levels

ASP 核心 2.2 更新

继承自 IdentityUserRole<Guid>不是字符串您可能还需要删除 ModelBuilder 中的代码以使迁移工作。

关于c# - .NET Core 2.1 Identity 获取所有用户及其相关角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004516/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com