我正在尝试为一个用户管理管理页面提取所有标识用户及其关联角色。我认为这相当容易,但显然不是。我尝试了以下解决方案:https://stackoverflow.com/a/43562544/5392786 但到目前为止还没有成功。
到目前为止,我掌握的情况如下:
应用程序用户:
public class ApplicationUser : IdentityUser
{
public List<IdentityUserRole<string>> Roles { get; set; }
}
数据库上下文
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
启动标识码
services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
我要在其中显示列表的页面:
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:“字段列表”中的“未知列”“u.roles.applicationserid”
11条答案
按热度按时间sq1bmfud1#
我实现了这个问题的解决方案,在性能和复杂性之间提供了一个我满意的平衡。我们执行一些数据库往返,每个角色一次,而不是每个用户一次。不需要dbmigrations或类重写。
tzdcorbm2#
对于dotnetcore3.1,我使用了以下一般方法。
它生成的sql非常简单合理:
f1tvaqid3#
接受的答案要求通过扩展自定义标识,否则将禁用rolemanager和usermanager。自定义asp.net核心标识时,不应再使用addentityframeworkstores。因为它将覆盖您以前的所有设置和自定义默认标识服务。首先,您需要创建具有以下签名的新服务:为什么这会违反类型参数“tuser”的约束?
不扩展,使用usermanager和rolemanager:
使用简单的构造函数Map到dto:
和startup.cs
jk9hmnmh4#
我通过创建一个包含我需要的所有列(包括角色)的视图并将其添加到上下文中来解决这个问题。
rekjcdws5#
通过调用\u usermanager.getrolesasync(user)函数循环用户列表并获取用户角色,并在一个字符串变量中使用“,”循环用户角色和拆分角色
祝你好运
plicqrtu6#
我需要在视图中显示一个用户拥有的所有角色,而不是这里已经提供的解决方案,我使用了这个快速而肮脏的东西:
_usermanager必须是公共的才能工作。而user只是identityuser的一个示例。
lrl1mhuk7#
效果很好。我使用的是整数键,所以我用int替换了string
linq:roleid=(从m.userroles中的a选择a.role.id).firstordefault(),
fzsnzjdm8#
参考意见
首先是获取数据的代码
在asp.net core 2.1中,我们需要像这样设置applicationrole,以便获得用户的角色。您需要定义要显式公开给用户使用的数据
最后
结果将是用户名和用户角色。如果用户有超过1个角色的数据将显示如下管理员,编辑等。。。
完整的代码可以在这里找到,希望对你有所帮助。
lvjbypge9#
我现在已经实现了以下解决方案。
正如codenotfound在评论中指出的,identityuser过去有一个
Roles
财产。在.NETCore中不再是这种情况。github上的这个评论/问题似乎是.netcore当前的解决方案。我尝试用以下代码实现它:应用程序用户
应用程序角色
应用程序角色
数据库上下文
启动
最后,确保在使用它时,您急切地加载用户的userrole,然后加载userrole的role,如下所示:
我有个问题
Role
各自的财产UserRole
为null,通过添加.ThenInclude(ur => ur.Role)
部分。microsoft文档的多级加载:https://docs.microsoft.com/en-us/ef/core/querying/related-data#including-多层次
asp core 2.2更新
固有的
IdentityUserRole<Guid>
您可能还需要删除modelbuilder中的代码才能使迁移工作正常。xwmevbvl10#
因为这是谷歌搜索的最热门结果;现在,您只需加入userroles dbset(如果您的db上下文继承自identitydbcontext)。
e、 g outer将roles表连接到任何用户角色,然后创建我们的manageusermodel(api的applicationuser类的简化信息):
这还演示了使用任何角色信息的where子句(上面只选择管理员和雇员角色中的用户)。
注意:这个内部连接identityuserrole,因此只有具有角色的用户才会返回,如果您希望所有用户只需在连接roleids的末尾添加一个“into identintroles”。。。行并相应地修改其余条件。
2jcobegt11#
您可以使用efcore5.0多对多特性,避免子类identityuserrole/identityrole。
应用程序用户
数据库上下文: