我正在使用ASP.NET MVC v5.2,Entity Framework v6.0(Code First)和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 });
答案 0 :(得分:4)
在展开IdentityDbContext
和IdentityUser
时,您无需为Logins
,Roles
和UserRoles
定义关系,因为它们是已经在基类中定义。你需要删除像modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
这样的行。
至于不使用默认UserManager
我可以根据您提供的代码看到这种情况。
UserManager
的默认实现在其构造函数中将IUserStore<TUser>
作为参数。如果您正在使用(或派生自)Microsoft.AspNet.Identity.EntityFramework库中的UserStore<TUser>
实现,则角色,声明和登录等内容将包含在对数据库进行的查询中。如果您要创建自己的实现IUserStore<TUser>
的类,那么您需要自己包含相关数据。一个例子如下所示。
public class ApplicationUser : IdentityUser
{
//Add your Custom Properties here..
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
//Add your Custom Properties here..
}
public class ApplicationUserStore : IUserStore<ApplicationUser>
{
private readonly ApplicationDbContext _context;
public ApplicationUserStore(ApplicationDbContext context)
{
_context = context;
}
public async Task<ApplicationUser> FindByIdAsync(string userName)
{
return await _context.Users.Include(x => x.Roles).FirstOrDefaultAsync(n => n.UserName == userName);
}
}