【发布时间】:2014-12-25 22:14:01
【问题描述】:
我正在使用 ASP.NET MVC v5.2、Entity Framework v6.0(代码优先)和 Identity 2.0 构建网站。
我的 UserAdmin 控制器中有以下代码:
// GET: /UserAdmin/Details/5
public async Task<ActionResult> Details(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var user = await UserManager.FindByIdAsync(id);
return View(user);
}
我的问题是,虽然我可以使用 UserManager 填充用户的角色,但在使用 FindByIdAsync 方法时,它没有选择与该用户关联的角色。
以下是 IdentityUserRole 表中的数据,该表显示了分配给两个角色的突出显示用户:
这是显示与上面相同的用户但角色计数为零的调试信息:
为什么没有返回该用户的角色?
编辑#1
我没有使用 UserManager 的默认实现。
我的 ApplicationUser 扩展了 IdentityUser 以允许我添加自定义属性。我的 ApplicationDbContext 扩展了 IdentityDbContext。
这里是我使用 Fluent API 为 Identity 设置主键的地方:
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
【问题讨论】:
-
您使用的是 UserManager、UserStore 等的默认实现吗?
-
a) 我可以看到您的
IdentityUserRole有ApplicationUser_Id和IdentityRole_Id列。他们不应该在那里。调整您的 DbContext 以删除这些列。 b) 当您从 DbContext 加载用户时,您需要专门加载角色 - 类似于:stackoverflow.com/a/26663667/809357 -
@Excommunicated 不,我的 ApplicationUser 使用自定义属性扩展了 IdentityUser。我的 ApplicationDBContext 还扩展了 IdentityDbContext
。我正在通过 Fluent API 建立关系。 -
@trailmax 我不确定我的 DbContext 的哪一部分导致这两个额外的列存在。我在帖子中添加了一些代码,以展示我如何使用 Fluent API 设置密钥。
-
IdentityUserRole长什么样子?
标签: asp.net asp.net-mvc entity-framework asp.net-identity roles