我在这个问题上做了一些搜索,并且遇到了一些关于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;
}
但是这种方式抛出一个错误,因为AspNetUserRoles不在EDMX设计器中,当我从数据库生成EF时。
我怎样才能使这个表出现,以便我可以继续我需要做的事情?
我已经尝试更新EDMX,但也不工作。
我自己也或多或少有过这个问题…"AspNetUserRoles表在模型中的什么位置?"
我的理解是,AspNetUserRoles表被创建并由两个外键组成,一个到AspNetUsers表,用于它的Id值,另一个到aspnettroles表,也用于其Id值。当你给一个用户分配一个角色时,它会在AspNetUserRoles表中添加一行,从而在AspNetUsers表中给你一个所谓的"导航属性"。看看你的edmx,找到AspNetUsers表,在底部你会看到一个"aspnettroles"的导航属性,这个集合可以在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表自动更新。