从数据库生成时,AspNetUserRoles 不在 EDMX 中
Posted
技术标签:
【中文标题】从数据库生成时,AspNetUserRoles 不在 EDMX 中【英文标题】:AspNetUserRoles not in EDMX when generating from database 【发布时间】:2017-03-27 15:00:30 【问题描述】:我对此问题进行了一些搜索,并遇到了一些关于从数据库生成时 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;
结果总是返回为空..
但是它应该看起来像这样
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,但也没有用。
【问题讨论】:
【参考方案1】:我自己或多或少地有这个问题......“模型中的 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();
对于原始海报,我会返回列表并使用它...
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 表自动更新。
【讨论】:
以上是关于从数据库生成时,AspNetUserRoles 不在 EDMX 中的主要内容,如果未能解决你的问题,请参考以下文章
在扩展的 Asp.Net Identity 2 错误中将角色分配给用户违反 PRIMARY KEY 约束“PK_dbo.AspNetUserRoles”
由于重命名的 AspNetUserRoles 列,ASP.NET Identity Model First 失败
从冗长的字典生成时,Pandas DataFrame.from_dict() 性能不佳