我已经在这个问题上进行了一些搜索,并且遇到了一些关于从数据库生成时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;
    }

结果总是返回为空。

但是它应该看起来像这样
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,但也无法正常工作。

最佳答案

我自己或多或少都有这个问题……“模型中的AspNetUserRoles表在哪里?”

我的理解是,AspNetUserRoles表已创建,并且由两个外键组成,一个外键用于其Id值到AspNetUsers表,一个外键也用于其Id值。当您为用户分配角色时,它将在AspNetUserRoles表中添加一行,以便为您提供AspNetUsers表上的“导航属性”。查看您的edmx并找到AspNetUsers表,在底部,您将看到“AspNetRoles”的Navigation属性,并且该集合可通过AspNetUser对象上的代码使用。

由于用户可以属于许多角色,因此此导航属性是一个集合,可以将其分配给类似于以下列表的列表:

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表自动更新。

关于entity-framework - 从数据库生成时,AspNetUserRoles不在EDMX中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40580867/

10-13 06:46