我在这个问题上做了一些搜索,并且在从数据库生成时遇到了一些关于AspNetUserRoles不在EDMX设计器中的问题。然而,它在ModelBrowser中并且我无法显示此表,因此我可以使用角色授权。
当我在Roles类中点击此方法时
public override string[] GetRolesForUser(string username)
{
DTE = new DatabaseTestingEntities();
string userID = DTE.AspNetUsers.Where(w => w.Email == username).Select(s => s.Id).FirstOrDefault();
string roleID = DTE.AspNetUsers.Include("AspNetRoles").Where(s => s.Id == userID).FirstOrDefault().ToString();//.AspNetUserRoles.Where(w => w.UserId == userID).Select(s => s.RoleId).FirstOrDefault();
string roleName = DTE.AspNetRoles.Where(w => w.Id == roleID).Select(s => s.Name).FirstOrDefault();
string[] results = { roleName };
return results;
}
结果总是以null为单位。
然而它应该是这样的
public override string[] GetRolesForUser(string username)
{
DTE = new DatabaseTestingEntities();
string userID = DTE.AspNetUsers.Where(w => w.Email == username).Select(s => s.Id).FirstOrDefault();
string roleID = DTE.AspNetUserRoles.Where(w => w.UserId == userID).Select(s => s.RoleId).FirstOrDefault();
string roleName = DTE.AspNetRoles.Where(w => w.Id == roleID).Select(s => s.Name).FirstOrDefault();
string[] results = { roleName };
return results;
}
但是这样会抛出错误,因为当我从数据库生成EF时,AspNetUserRoles不在EDMX设计器中。
如何才能显示此表格,以便继续我需要做的事情?
我已尝试更新EDMX,但也无法正常工作。
答案 0 :(得分:1)
我自己或多或少地提出了这个问题......“模型中的AspNetUserRoles表在哪里?”
我的理解是AspNetUserRoles表是由两个外键组成的,一个是AspNetUsers表,一个是Id的值,一个是AspNetRoles表,也是它的Id值。将角色分配给用户时,它会在AspNetUserRoles表中添加一行,以便在AspNetUsers表上为您提供所谓的“导航属性”。查看您的edmx并找到AspNetUsers表,在底部您将看到“AspNetRoles”的导航属性,并且您可以在AspNetUser对象的代码中使用此集合。
由于用户可以属于多个角色,因此该导航属性是一个可以分配给List的集合,如下所示:
AspNetUser selectedUser = dbContext.AspNetUsers.FirstOrDefault(u => u.UserName == "foo");
if (selectedUser == null) return;
List<AspNetRole> selectedUsersRoles = selectedUser.AspNetRoles.ToList();
对于原始海报,我会返回列表并使用它......
public override List<AspNetRoles> GetRolesForUser(string username)
{
DTE = new DatabaseTestEntities();
AspNetUser selectedUser = DTE.AspNetUsers.FirstOrDefault(u => u.UserName == username);
if (selectedUser == null) return null; //User not found - return null
return List<AspNetRole> selectedUsersRoles = selectedUser.AspNetRoles.ToList();
}
这基本上意味着您不需要显式“需要”AspNetUserRoles表。您应该能够使用上面提到的用户角色。我不确定是否推荐,但我也不会直接插入AspNetUserRoles表。您应该只是向用户对象添加一个角色,并让UserRoles表自动更新。