在.NET Core 2.1中获取所有用户及其关联角色的MySQL指南
在使用MySQL和.NET Core 2.1的Identity时,您可能需要获取所有已注册用户及其对应的角色。 这在开发需要访问整个系统用户的管理控制台时非常有用。 下面是如何在.NET Core中使用MySQL进行此操作的指南。
阅读更多:MySQL 教程
添加所需的依赖项和包
首先,您需要将以下包添加到您的项目中:
- MySql.Data.EntityFrameworkCore (用于MySQL与.NET Core的集成)
- Microsoft.AspNetCore.Identity.EntityFrameworkCore (用于.NET Core Identity)
打开您的项目文件并添加这些包的引用,如下所示:
<ItemGroup>
<PackageReference Include="MySql.Data.EntityFrameworkCore" Version="8.0.21" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.2.0" />
</ItemGroup>
创建用户和角色模型
您需要为用户和角色创建模型。这些模型将与数据库表关联。 下面是一个用户模型示例:
public class ApplicationUser : IdentityUser
{
//User additional properties
}
注意,ApplicationUser
继承 IdentityUser
类。 这意味着您可以在用户模型中使用 IdentityUser
内置的属性,例如用户名和电子邮件属性。
接下来,您将创建角色模型,如下所示:
public class ApplicationUserRole : IdentityUserRole<string>
{
//This model can be empty since it's just a mapping between different tables
}
此模型包含在用户和角色之间建立关系所需的信息。
上下文模型
接下来,您需要创建上下文模型。这将包含用户和角色的所有表格,并将使您能够查询它们。 下面是示例:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<string>, 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<ApplicationUser>().ToTable("AspNetUsers");
builder.Entity<IdentityRole<string>>().ToTable("AspNetRoles");
builder.Entity<IdentityUserRole<string>>().ToTable("AspNetUserRoles");
builder.Entity<IdentityUserLogin<string>>().ToTable("AspNetUserLogins");
builder.Entity<IdentityUserToken<string>>().ToTable("AspNetUserTokens");
builder.Entity<IdentityUserClaim<string>>().ToTable("AspNetUserClaims");
builder.Entity<IdentityRoleClaim<string>>().ToTable("AspNetRoleClaims");
builder.Entity<IdentityUserRole<string>>(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();
});
}
}
上面的代码将表格命名为AspNetUsers、AspNetRoles、AspNetUserRoles等。 它还指定了如何定义用户和角色之间的关系。
控制器
有了上面的内容,您可以轻松地创建一个控制器来检索所有用户及其对应的角色。 下面是如何实现:
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
[ApiController]
[Route("[controller]")]
public class UserController : Controller
{
private UserManager<ApplicationUser> _userManager;
private RoleManager<IdentityRole<string>> _roleManager;
public UserController(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole<string>> roleManager)
{
_userManager = userManager;
_roleManager = roleManager;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<UserViewModel>>> Get()
{
var users = await _userManager.Users.ToListAsync();
var userViewModels = new List<UserViewModel>();
foreach (var user in users)
{
var userRoles = await _userManager.GetRolesAsync(user);
userViewModels.Add(new UserViewModel{
Id = user.Id,
UserName = user.UserName,
Email = user.Email,
Roles = userRoles
});
}
return Ok(userViewModels);
}
}
public class UserViewModel
{
public string Id { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public IEnumerable<string> Roles { get; set; }
}
上面的代码将在请求到达时检索所有用户,并为每个用户检索其角色。最后,该控制器将返回一个带有用户详细信息和其角色的列表。
总结
通过上述步骤,您可以轻松地检索所有相关用户及其角色。此外,还可以使用此方法检索在数据库中保留的其他用户详细信息。在使用.NET Core 2.1和MySQL时,这是一个非常有用的技巧,可以将其用于开发带有管理员控制台的任何Web应用程序。