从数据库生成时,AspNetUserRoles 不在 EDMX 中

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,但也不起作用。

lg1*_*382 2

我自己或多或少有这个问题......“模型中的 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 表自动更新。