Chr*_*ris 5 entity-framework edmx user-roles asp.net-identity
我在这个问题上做了一些搜索,并遇到了一些关于从数据库生成时 AspNetUserRoles 不在 EDMX 设计器中的问题。但是它在 ModelBrowser 中,我无法显示此表,因此我可以使用角色授权。
当我在我的角色类中点击这个方法时
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;
}
Run Code Online (Sandbox Code Playgroud)
结果总是返回为空..
但是它应该看起来像这样
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;
}
Run Code Online (Sandbox Code Playgroud)
但是这种方式会引发错误,因为当我从数据库生成 EF 时,AspNetUserRoles 不在 EDMX 设计器中。
我怎样才能让这个表出现,这样我就可以继续我需要做的事情?
我曾尝试更新 EDMX,但也不起作用。
我自己或多或少有这个问题......“模型中的 AspNetUserRoles 表在哪里?”
我的理解是,AspNetUserRoles 表已创建并由两个外键组成,一个外键指向 AspNetUsers 表,用于其 Id 值,另一个外键指向 AspNetRoles 表,也用于其 Id 值。当您向用户分配角色时,它会在 AspNetUserRoles 表中添加一行,以便为您提供 AspNetUsers 表上所谓的“导航属性”。查看您的 edmx 并找到 AspNetUsers 表,在底部您将看到“AspNetRoles”的导航属性,并且您可以在 AspNetUser 对象的代码中使用该集合。
由于用户可以属于多个角色,因此该导航属性是一个可以分配给列表的集合,如下所示:
AspNetUser selectedUser = dbContext.AspNetUsers.FirstOrDefault(u => u.UserName == "foo");
if (selectedUser == null) return;
List<AspNetRole> selectedUsersRoles = selectedUser.AspNetRoles.ToList();
Run Code Online (Sandbox Code Playgroud)
对于原始海报,我会返回列表并使用它......
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();
}
Run Code Online (Sandbox Code Playgroud)
这基本上意味着您不需要显式“需要”AspNetUserRoles 表。您应该能够使用如上所述的用户角色。我不确定是否推荐,但我也不会直接插入到 AspNetUserRoles 表中。您应该只向用户对象添加一个角色,并让 UserRoles 表自动更新。
| 归档时间: |
|
| 查看次数: |
1679 次 |
| 最近记录: |